WPF-Aktualisierung Bindung bei direkter Bindung an DataContext mit Konverter

7

Wenn Sie möchten, dass ein datengebundenes Steuerelement aktualisiert wird, verwenden Sie normalerweise das Ereignis "PropertyChanged", um der Schnittstelle zu signalisieren, dass sich die Daten hinter den Kulissen geändert haben.

Sie könnten beispielsweise einen Textblock haben, der mit einer Eigenschaft "DisplayText"

an den Datenkontext gebunden ist

<TextBlock Text="{Binding Path=DisplayText}"/>

Wenn von hier aus der DataContext das PropertyChanged-Ereignis mit PropertyName "DisplayText" auslöst, sollte der Text dieses Textblocks aktualisiert werden (vorausgesetzt, Sie haben den Modus der Bindung nicht geändert).

Allerdings habe ich eine kompliziertere Bindung, die viele Eigenschaften des Datenkontexts verwendet, um das endgültige Aussehen und Verhalten des Steuerelements zu bestimmen. Um dies zu erreichen, binde ich direkt an den Datenkontext und benutze einen Konverter. In diesem Fall arbeite ich mit einer Bildquelle.

<Image Source="{Binding Converter={StaticResource ImageConverter}}"/>

Wie Sie sehen können, verwende ich ein {Binding} ohne Pfad, um direkt an den Datenkontext zu binden, und ich benutze einen ImageConverter, um das Bild auszuwählen, nach dem ich suche. Aber jetzt habe ich keine Möglichkeit (das ich weiß), diese Bindung zu aktualisieren. Ich habe versucht, das propertychanged-Ereignis mit "." als der Name der Eigenschaft, der nicht funktioniert hat.

Ist das möglich? Muss ich die Konvertierungslogik in eine Eigenschaft einbinden, an die die Bindung anhängen kann, oder gibt es eine Möglichkeit, die Bindung zu aktualisieren (ohne die Bindung explizit zu aktualisieren)?

Jede Hilfe wird sehr geschätzt. Vielen Dank! -Adam

    
Adam 19.04.2010, 20:27
quelle

3 Antworten

17

Die Umgehungslösung bestand darin, meinem Objekt (das als Datenkontext verwendet werden soll) eine Eigenschaft namens "Self" hinzuzufügen, die einfach

zurückgab

public Object Self { get { return this; }}

Dann in der Bindung habe ich diese Eigenschaft verwendet:

<Image Source="{Binding Path=Self, Converter={StaticResource ImageConverter}}"/>

Wenn ich dann

rufe

PropertyChanged(this, new PropertyChangedEventArgs("Self"))

es funktioniert wie ein Zauber.

Danke allen.

    
Adam 19.04.2010, 21:03
quelle
2

Ich glaube nicht, dass es einen Weg gibt, genau das zu erreichen, was Sie mit Ihrem aktuellen Konverter brauchen. Wie Sie bereits erwähnt haben, könnten Sie die Berechnung in Ihrem ViewModel durchführen, oder Sie könnten Ihren Konverter in ein IMulitValueConverter ändern.

Aus Ihrem spezifischen Szenario (dem Konverter, der an eine ViewModel-Klasse gebunden ist, und einigen seiner Eigenschaften) würde ich mich darauf konzentrieren, die Logik im ViewModel zu implementieren.

    
Abe Heidebrecht 19.04.2010 20:54
quelle
0

Hmm, Sie zeigen nicht die vollständige Implementierung. Aber ich denke, es sollte aktualisiert werden, wenn der an die GUI gebundene Wert das PropertyChanged-Event liefert.

Grüße

    
DHN 19.04.2010 20:38
quelle