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

作者: 周銀輝  來源: 博客園  發布時間: 2009-02-27 15:09  閱讀: 3409 次  推薦: 0   原文鏈接   [收藏]  

大概兩個月前,曾有位朋友問我:如果我想在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()方法(上面被注釋掉的部分)來提供給客戶程序.

要如何實現下面的功能:
       
        綁定到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}}

0
0
 
標簽:WPF
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()