2016-01-13 33 views
6

私は最初にバインディングに新しいです。私はWPFでいくつかのことをしていますが、コンセプトはあまりにも難しいバットの右の私のために理解してください。私が今やっていることは、私が完全に理解していないチュートリアルから救済することができたものです。リソースが変更されたときに静的バインディングが更新されない

私のアプリケーションでは、静的なプロパティを持つ静的クラスがあり、静的なプロパティを変更する静的メソッドがあります。

例:私はそれがこの値にバインドさ、背景のしているコントロールを持っているXAMLインサイド

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


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

。私はネームスペースを適切に宣言しました。アプリケーションの負荷が、それは物事が変化し、ChangeTheme()が呼び出されたが正しい設定(赤い色)をロードします

... 
    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"/> 

は、静的クラスは、しかし、テキストボックスの背景が変更されません、新しい値を取得します。 ここで何が間違っていますか?私が言ったように、私はこれに非常に新しく、私は平凡な言葉で解決策を理解するだろう。

ありがとうございました!

答えて

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

関連する問題