1. 程式人生 > >WPF中,如何將綁定源設置到單件實例

WPF中,如何將綁定源設置到單件實例

ace text button 數據 win 真的 大話設計模式 不同的 圖片

原文:WPF中,如何將綁定源設置到單件實例

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

首先我們簡單地寫一個使用了單件模式的MyButton類:
技術分享圖片 public class

MyButton : Button
技術分享圖片
{
技術分享圖片
private MyButton()
技術分享圖片
{
技術分享圖片
this.Content = "hahhaha, it‘s me";
技術分享圖片 }

技術分享圖片
技術分享圖片
private static MyButton instance = new MyButton();
技術分享圖片
技術分享圖片
public static MyButton Instance
技術分享圖片
{
技術分享圖片
get
技術分享圖片
{
技術分享圖片
return instance;
技術分享圖片
}

技術分享圖片 }

技術分享圖片
技術分享圖片
//public static MyButton GetInstance()
技術分享圖片
//{
技術分享圖片
// return instance;
技術分享圖片
//}
技術分享圖片
}

技術分享圖片}

OK,我們不討論設計模式,我們討論針對不同的單例提供方式,我們在XAML中如何使用它,這裏所說的"單例提供方式"是指,要麽是使用上面的Instance只讀屬性方式提供,或是使用GetInstance()方法(上面被註釋掉的部分)來提供給客戶程序.

要如何實現下面的功能:
<Label Content="{綁定到MyButton的單件實例上(即Instance)

}"/>
<TextBox Text="{綁定到MyButton的單件實例上(即Instance)},Path=Content,
Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>


1,若是使用屬性方式提供:
這比較簡單,你只需要了解x:Static標記就足夠了.它負責對靜態數據的引用.
首先,在Xaml代碼中加入我們的名字空間:

技術分享圖片xmlns:local="clr-namespace:WpfApplication3" 然後,這樣使用就OK:
技術分享圖片<TextBox Text="{Binding Source={x:Static local:MyButton.Instance},Path=Content,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> 看看效果吧:
技術分享圖片
改變下面文本框的文本,上面按鈕上的文本也會隨之改變,都是引用到同一個單例嘛:)

2,若是使用方法方式提供:
即采用下面的方式提供的
技術分享圖片 public static MyButton GetInstance()
技術分享圖片
{
技術分享圖片
return instance;
技術分享圖片 }
有可能這個單例類根本就不是你設計的,沒有理由讓人家將方法改成屬性哈,沒關系的,同樣可以輕松解決.但你得了解在WPF中如何綁定到方法.
OK,我們在資源字典中添加一個如下的ObjectDataProvider:
技術分享圖片 <Window.Resources>
技術分享圖片
<ObjectDataProvider x:Key="myButtonKey" ObjectType="{x:Type local:MyButton}" MethodName="GetInstance"/>
技術分享圖片
</Window.Resources> 其將從MyButton類中的GetInstance方法的返回值取得對象,然後我們就可以像使用普通資源一樣使用它了:
技術分享圖片<TextBox Text="{Binding Source={StaticResource myButtonKey},Path=Content,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> 效果圖就不必看了哈,和上面的圖一模一樣.


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



WPF中,如何將綁定源設置到單件實例