2016-01-13 88 views
6

我首先想說我對綁定非常陌生..我已經在WPF中做了一些事情,但是我從來沒有使用綁定,因爲概念有點太難了瞭解我的權利的蝙蝠。即使是我現在正在做的事情,也是我從一篇我並沒有完全理解的教程中拯救出來的東西。當資源發生變化時,靜態綁定不會更新

在我的應用程序中,我有一個具有靜態屬性的靜態類,並且有一個靜態方法來改變這些靜態屬性。

例子:

public static class AppStyle 
{ 
    public static SolidColorBrush property = Brushes.Red; 


    public static void ChangeTheme() 
    { 
     property = Brushes.Blue; 
    } 
} 

的XAML裏面我有有它的背景綁定到該值的控制。我甚至正確地聲明瞭命名空間。

... 
    xmlns:style="clr-namespace:CorrectNamespace;assembly=RightAssembly" 
... 
<TextBox x:Name="TXT_PN" 
    Background="{Binding Source={x:Static style:AppStyle.property}}"   
    TextChanged="TXT_PN_TextChanged" 
    Text="Text"/> 

當應用程序加載它會加載正確的設置(紅色),但是當事情發生變化,ChangeTheme()被調用時,靜態類將獲得新的價值,但文本框的背景不會改變。 我在這裏做錯了什麼?正如我所說,我對此很陌生,我會感激外行人員的解決方案。

謝謝!

回答

6

首先,你的property實際上不是一個財產,而是一個領域。一個最小的財產申報應該是這樣的:

public static SolidColorBrush Property { get; set; } 

請注意,該名稱開頭的大寫字母,這是在C#中被廣泛接受的編碼約定。

由於您還希望在屬性值更改時觸發更改通知,因此需要聲明屬性更改的事件(對於非靜態屬性通常通過實現INotifyPropertyChanged接口完成)。

對於靜態特性有在WPF 4.5(或4.0?),一個新的機制,你可以寫一個靜態屬性更改事件和財產申報是這樣的:

public static class AppStyle 
{ 
    public static event PropertyChangedEventHandler StaticPropertyChanged; 

    private static void OnStaticPropertyChanged(string propertyName) 
    { 
     var handler = StaticPropertyChanged; 
     if (handler != null) 
     { 
      handler(null, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    private static SolidColorBrush property = Brushes.Red; // backing field 

    public static SolidColorBrush Property 
    { 
     get { return property; } 
     set 
     { 
      property = value; 
      OnStaticPropertyChanged("Property"); 
     } 
    } 

    public static void ChangeTheme() 
    { 
     Property = Brushes.Blue; 
    } 
} 

靜態屬性的結合會寫在括號內的財產路徑:

Background="{Binding Path=(style:AppStyle.Property)}"   
+0

謝謝你的深入答覆。讓我補充一點,我確實使用{get; set;}來表示我的屬性,在我的問題中,我錯過了它。我還有1個關於你的答案的問題;我的課程是在另一個項目中的dll中,我是在那裏編寫第一個代碼塊還是在我正在使用的xaml的.cs文件中編寫代碼塊? – DethoRhyne

+1

這一切都在類AppStyle中,請參閱我的編輯。 – Clemens

+0

非常感謝。我已經應用了您的代碼,現在一切正在運行。我會確保記住這一點。再次謝謝你! :) – DethoRhyne

0

要對變更實施反應,您需要通知變更。請參閱INotifyPropertyChanged接口。但是,您不能將其與靜態類一起使用。那麼單身人士(理想情況下使用一些依賴注入容器)而不是靜態類呢?

+0

謝謝你的回覆,但是,克萊門斯的回答幫助了我多一點。我說我是新來的人,我必須說我從來沒有聽說過你提到過的一些詞。我知道接口,但我不知道如何利用它,因爲我沒有得到那麼遠的C# – DethoRhyne

相關問題