WPF中,如何將綁定源設置到單件實例
大概兩個月前,曾有位朋友問我:如果我想在WPF中將綁定源設置到某個采用單件模式設計的實例上,應該怎么做呢?這是一個不錯的問題.可能這段時間比較忙,呵呵,忘記回答這個問題了,昨天拿到伍迷大哥的《大話設計模式》(PS:強烈推薦該書哈,真的不錯)時突然想起這個問題了.今天簡要說一下:
首先我們簡單地寫一個使用了單件模式的MyButton類:























OK,我們不討論設計模式,我們討論針對不同的單例提供方式,我們在XAML中如何使用它,這里所說的"單例提供方式"是指,要么是使用上面的Instance只讀屬性方式提供,或是使用GetInstance()方法(上面被注釋掉的部分)來提供給客戶程序.
要如何實現下面的功能:
綁定到MyButton的單件實例上(即Instance)},Path=Content,
Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
1,若是使用屬性方式提供:
這比較簡單,你只需要了解x:Static標記就足夠了.它負責對靜態數據的引用.
首先,在Xaml代碼中加入我們的名字空間:

然后,這樣使用就OK:

PropertyChanged}"/>
看看效果吧:
改變下面文本框的文本,上面按鈕上的文本也會隨之改變,都是引用到同一個單例嘛:)
2,若是使用方法方式提供:
即采用下面的方式提供的




有可能這個單例類根本就不是你設計的,沒有理由讓人家將方法改成屬性哈,沒關系的,同樣可以輕松解決.但你得了解在WPF中如何綁定到方法.
OK,我們在資源字典中添加一個如下的ObjectDataProvider:


ObjectType="{x:Type local:MyButton}" MethodName="GetInstance"/>

其將從MyButton類中的GetInstance方法的返回值取得對象,然后我們就可以像使用普通資源一樣使用它了:

PropertyChanged}"/>
效果圖就不必看了哈,和上面的圖一模一樣.
另外:說到x:Static,另起一個問題:操作系統給我們提供很多資源,比如:桌面工作區的大小,系統顏色等,應該如何跟蹤這些值呢.以前我的一個同事遇到這樣一個問題,其應用程序主窗口鋪滿整個桌面工作區,但該窗口沒有邊框,其將窗口大小綁定到SystemParameters.WorkArea.Width和SystemParameters.WorkArea.Height上的,但其發現用戶更改了工作區大小(比如將任務欄拖高一些,工作區就變小了)后,窗口卻不知道這事而無法及時調整自身大小來適合新的工作區大小.這里需要說明的是,我們對應靜態數據的引用常常會寫成下面這種方式:
{x:Static SystemColors.WindowBrush},這是有效的,但當WindowBrush值發生變化后,你的應用是不會隨之改變的
正確的方式是:
{DynamicResource {x:Static SystemColors.WindowBrush}}