轉(zhuǎn)帖|其它|編輯:郝浩|2011-05-30 14:48:24.000|閱讀 653 次
概述:在《WPF/Silverlight的數(shù)據(jù)綁定設計的真糟糕》文中批評了WPF/SL的數(shù)據(jù)綁定機制,拿的是Flex的數(shù)據(jù)綁定與其對比。本文介紹應用Flex的數(shù)據(jù)綁定來解決一個實際問題——多語言實時切換的問題,以說明簡潔的數(shù)據(jù)綁定機制解決問題是多么的優(yōu)雅。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在《WPF/Silverlight的數(shù)據(jù)綁定設計的真糟糕》文中批評了WPF/SL的數(shù)據(jù)綁定機制,拿的是Flex的數(shù)據(jù)綁定與其對比。本文介紹應用Flex的數(shù)據(jù)綁定來解決一個實際問題——多語言實時切換的問題,以說明簡潔的數(shù)據(jù)綁定機制解決問題是多么的優(yōu)雅。
需要解決的問題:
有一個語言選擇下拉菜單,用戶選擇不同的語言,自動去服務器獲取語言資源,然后自動更新界面上的顯示。
這個問題看起來很復雜,傳統(tǒng)的解決辦法是在涉及到多語言的界面處偵聽語言切換的事件,然后更新自己,這樣的做法零碎冗長。使用數(shù)據(jù)綁定是個自然有效的方法。
核心類只1個:
import common.RpcRequest;
public dynamic class Lang extends Object
{
[Bindable]
public static var instance:Lang = new Lang;
public function getString(key:String, defaultString:String = null):String
{
if(this.hasOwnProperty(key)==false)
{
return defaultString ? defaultString : key;
}
else
{
return this[key];
}
}
public static function loadRemote(url:String, callback:Function = null):void
{
new RpcRequest(url, null,
function(obj:Object):void
{
loadXml(new XML(obj));
if(callback != null) callback();
}
);
}
public static function loadXml(xml:XML):void
{
if(xml == null) return;
var lang:Lang = new Lang();
for each(var node: XML in xml.item)
{
lang[node.@key]=String(node.@value);
}
instance = lang;
}
}
使用loadRemote去加載資源,成功的話自動更新綁定源instance。如果設置了回調(diào)方法,可以傳入回調(diào)方法來干其它的事情。
資源文件舉例:
<lang>
<item key="Help" value="Help Tips" />"
<item key="MoreInfo" value="More Informations" />"
<item key="FlipToFront" value="Flip to Front Cover" />"
…
</lang>
使用:
toolTip="{RunTime.fullScreen
?Lang.instance.getString('ExitFullScreen','Exit Full Screen')
:Lang.instance.getString('FullScreen','Full Screen')}"
更進一步,可以將類名Lang簡化為l,將instance簡化為_,將getString簡化為s。這樣代碼又可以簡潔一些。
實時切換語言一行代碼搞定:
Lang.loadRemote(langUrl);
總結:
(1)簡潔嗎?簡潔!
(2)需要學新東西嗎?不需要!
(3)需要配置嗎?不需要!
(4)對比是不是覺得WPF/SL的數(shù)據(jù)綁定過度設計了?是的!
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務必注明出處、不得修改原文相關鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客園