2010-04-19 16 views
7

Wenn Sie ein datengebundenes Steuerelement aktualisieren möchten, verwenden Sie normalerweise das Ereignis "PropertyChanged", um der Schnittstelle zu signalisieren, dass sich die Daten im Hintergrund geändert haben.WPF-Aktualisierung Bindung bei direkter Bindung an DataContext mit Konverter

Zum Beispiel könnten Sie einen Textblock haben, der an die Datacontext mit einer Eigenschaft „Displaytext“

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

Von hier gebunden ist, wenn die Datacontext hebt das Property Ereignis mit Property „Displaytext“, dann Der Text dieses Textblocks sollte aktualisiert werden (vorausgesetzt, Sie haben den Modus der Bindung nicht geändert).

Allerdings habe ich eine kompliziertere Bindung, die viele Eigenschaften aus dem Datenkontext verwendet, um das endgültige Aussehen und das Gefühl 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 eine {Binding} ohne Pfad direkt an den Datacontext zu binden, und ich verwende ein Image Converter das Bild auszuwählen, die 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 würde sehr geschätzt werden. Danke! -Adam

Antwort

17

Die Abhilfe hier war eine Eigenschaft zu meinem Objekt hinzuzufügen (als die Datacontext verwendet werden) als „Selbst“, die einfach

zurück

public Object Self { get { return this; }}

Dann in der Bindung ich diese Eigenschaft verwendet:

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

Dann, wenn ich rufe

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

es funktioniert wie ein Charme.

Danke allen.

+0

DANKE! Ich war verrückt danach zu suchen und wollte es fragen, als es auf meinen Vorschlägen erschien – HDD

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

+0

Das Problem ist, dass die Bildquelle direkt an den Datenkontext gebunden ist, keine Eigenschaft des Datenkontextes. Der Konverter übernimmt den Datenkontext und gibt eine Bildquelle zurück. Um zu verdeutlichen, die Aktualisierung tritt auf (funktioniert), wenn ich eine Bindung verwenden, die einen Pfad zu einer Eigenschaft des Datenkontexts hat, und dann PropertyChanged für diese Eigenschaft aufrufen. Ich brauche jedoch das Objekt selbst, um das Bild zu bestimmen (mehr als nur eine Eigenschaft). Danke. – Adam

+0

hatte einen Gedanken beim Tippen das aus. Ich werde versuchen, eine Eigenschaft auf mein Objekt namens "Self" zu setzen, das sich selbst zurückgibt und dann PropertyChanged ("Self") aufruft. Ich gebe das eine Chance. – Adam

2

Ich glaube nicht, gibt es einen Weg, um genau zu bewerkstelligen, was Sie mit Ihrem Strom-Wandler benötigen. Wie Sie bereits erwähnt haben, könnten Sie die Berechnung in Ihrem ViewModel durchführen oder Ihren Konverter in eine IMulitValueConverter ändern.

Aus Ihrem spezifischen Szenario (der an eine ViewModel-Klasse gebundene Konverter und einige seiner Eigenschaften) würde ich die Implementierung der Logik im ViewModel unterstützen.