2016-01-13 25 views
6

Ich möchte zuerst sagen, dass ich Bining sehr neu bin. Ich habe schon einige Dinge in WPF getan, aber ich habe nie Binding verwendet, weil das Konzept zu schwer ist verstehe für mich recht von der Fledermaus. Auch das, was ich jetzt mache, konnte ich aus einem Tutorial retten, das ich nicht ganz verstanden habe.Statische Bindung wird nicht aktualisiert, wenn sich die Ressource ändert

In meiner Anwendung habe ich eine statische Klasse mit statischen Eigenschaften und es gibt eine statische Methode, die diese statischen Eigenschaften ändert.

Beispiel:

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


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

Im Inneren des XAML habe ich ein Steuerelement, das es ist Hintergrund dieser Wert binded hat. Ich habe sogar den Namensraum richtig deklariert.

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

Wenn die Anwendung geladen wird jedoch die richtige Einstellung (rote Farbe) laden, wenn die Dinge ändern und ChangeTheme() aufgerufen wird, wird die statische Klasse den neuen Wert bekommen, aber der Hintergrund der Textbox wird sich nicht ändern. Was mache ich hier falsch? Wie ich schon sagte, ich bin sehr neu und ich würde die Lösung in Laiensprache schätzen.

Vielen Dank!

Antwort

6

Zunächst ist Ihre property eigentlich keine Eigenschaft, sondern ein Feld. Eine minimale Eigenschaft Erklärung würde wie folgt aussehen:

public static SolidColorBrush Property { get; set; } 

Bitte beachten Sie den Namen mit einem Großbuchstaben beginnt, die eine weithin akzeptierte Codierung Konvention in C# ist.

Da eine Änderungsbenachrichtigung auch dann ausgelöst werden soll, wenn sich der Wert der Eigenschaft ändert, müssen Sie ein Ereignis mit geänderter Eigenschaft deklarieren (was für nicht statische Eigenschaften normalerweise durch Implementieren der INotifyPropertyChanged-Schnittstelle erfolgt).

Für statische Eigenschaften gibt es einen neuen Mechanismus in WPF 4.5 (oder 4.0?), In dem Sie eine statische Eigenschaft geänderte Ereignis und Eigenschaftsdeklaration wie folgt schreiben kann:

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; 
    } 
} 

Die auf eine statische Eigenschaft Bindung würde mit dem Eigenschaftspfad in Klammern geschrieben werden:

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

Vielen Dank für die eingehende Antwort. Lass mich einfach hinzufügen, dass ich {get; set;} für meine Eigenschaften verwende, ich habe es hier in meiner Frage einfach verpasst. Ich habe noch eine Frage zu Ihrer Antwort. meine Klasse ist in einer DLL, die in einem anderen Projekt ist, schreibe ich den ersten Codeblock dort oder in .cs der XAML, in der ich arbeite? – DethoRhyne

+1

Es ist alles in Klasse AppStyle, siehe meine Bearbeitung. – Clemens

+0

Vielen Dank. Ich habe Ihren Code angewendet und alles funktioniert jetzt. Ich werde mich daran erinnern. Nochmals vielen Dank! :) – DethoRhyne

0

Um eine Reaktion auf eine Änderung zu implementieren, müssen Sie über die Änderung informieren. Siehe INotifyPropertyChanged-Schnittstelle. Sie können es jedoch nicht mit einer statischen Klasse verwenden. Was ist mit einem Singleton (idealerweise mit einem Abhängigkeitsinjektionscontainer) anstelle einer statischen Klasse?

+0

Vielen Dank für Ihre Antwort, aber Clemens Antwort hat mir ein bisschen mehr geholfen. Ich sagte, dass ich neu bin zu binden und ich muss sagen, dass ich noch nie von einigen der Worte gehört habe, die du erwähnt hast. Ich weiß über die Schnittstelle, aber ich habe keine Ahnung, wie man es benutzt, da ich so weit in C# noch nicht gekommen bin – DethoRhyne

Verwandte Themen