2013-08-14 6 views
10

Ich habe ein ViewModel mit einem komplexen Eigenschaftstyp und möchte meine Ansicht an eine verschachtelte Eigenschaft dieses Objekts binden.WPF-Bindungsaktualisierungsbenachrichtigung für geschachtelte Eigenschaft, wenn sich die übergeordnete Eigenschaft ändert

Mein ViewModel implementiert INotifyPropertyChanged (oder wird exact sein BaseViewModel implementiert es). Die Klasse der übergeordneten Eigenschaft implementiert INotifyPropertyChanged nicht.

Wenn ich den Wert der übergeordneten Eigenschaft aktualisiere, wird die verschachtelte Eigenschaft nicht aktualisiert. Können Sie mir sagen, wie ich diese Funktionalität implementieren kann?

Ansichtsmodell

public class ViewModel : BaseViewModel 
{ 
    private Car _myCarProperty; 

    public Car MyCarProperty 
    { 
     get { return _myCarProperty; } 
     set 
     { 
      if (value == _myCarProperty) return; 

      _myCarProperty = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

im View-Bindung

<TextBlock Text="{Binding Path=MyCarProperty.Manufacturer}" /> 

Wenn ich den Wert MyCarProperty ändern die Ansicht nicht aktualisiert.

Danke für jede Hilfe!

Edit: OnPropertyChanged() -Implementierung

#region INotifyPropertyChanged 

public event PropertyChangedEventHandler PropertyChanged; 

[NotifyPropertyChangedInvocator] 
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    PropertyChangedEventHandler handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

#endregion INotifyPropertyChanged 
+0

Haben Sie Kindereigentum benachrichtigt? –

+0

Die Klasse 'Car' implementiert 'INotifyPropertyChanged' nicht. Aber ich ändere nicht die Eigenschaft 'Manufacturer', ändere die Eigenschaft' MyCarProperty' und erwarte daher, dass das OnNotifyPropertyChanged-Ereignis die Wertaktualisierung auslöst?- Bitte sehen Sie meine bearbeitete Frage. –

+1

Können Sie uns zeigen, wie OnPropertyChanged implementiert ist? –

Antwort

15

„Die Klasse Car ist INotifyPropertyChanged nicht Implementierung Aber ich bin nicht die Eigenschaft Hersteller ändern, ich die MyCarProperty Eigenschaft zu ändern, und ich erwarte, so dass das OnNotifyPropertyChanged Ereignis wird die Wertaktualisierung auslösen? "

Nein, es wird nicht den Wert auslösen eine Ebene nach unten aktualisieren. Bindungen hören nicht auf Änderungen der Eigenschaften für einen gesamten Pfad, sie hören nur auf das Objekt, an das sie gebunden sind.

Ich sehe ein paar Optionen aus der Spitze von meinem Kopf (in der Reihenfolge meiner Präferenz, wenn ich in diesem Lauf):

  1. Bind, um das Auto, nicht die Unter Eigenschaft, und erstellen data template dass Displays was willst du draus machen?
  2. Kicken Sie manuell die Bindung, indem Sie UpdateTarget auf BindingExpression aufrufen, wenn Sie müssen.

Ich weiß, es sieht aus wie es viel mehr ist auf der Datenvorlage Route zu lernen, aber ich verspreche Ihnen, dass Datenvorlagen erheblich mächtiger erweisen, skalierbare und leicht zu verwaltende und nützlicher als manuell Bindungen, wie Sie treten arbeite mehr in WPF. (Auch wenn Sie sie einmal verstehen, ich denke, sie sind tatsächlich weniger Arbeit als manuell kicking Bindungen).

Viel Glück!

+0

Danke Greg! Ich kenne Datenvorlagen und sollte keine Probleme damit haben. Ich hatte das gleiche Problem vor einiger Zeit und ich erinnere mich, dass ich etwas in der Vergangenheit gefunden habe, das wie "tief aussehende Bindungen" klingt, aber ich denke, es war nur die 'VeryObservableCollection', die ich gefunden habe (http://stackoverflow.com)/questions/6542035/listview-not-update-korrekt-mit-observablecollection) - was bei diesem Problem nicht hilft. Ich hoffte, dass etwas Ähnliches existieren würde. Aber die Datenvorlage Idee ist perfekt :) –

+0

Sorry, was? WPF hört nicht auf Änderungen auf dem Pfad? Ich wünschte, ich wüsste das, bevor ich überall Kettenwege benutzte. Hey, hör auf. Es klappt! ;) –

+0

@Greg D, der Link "Datenvorlage" ist veraltet. Tut mir leid, ich bin nur gelangweilt. –

3

Ich bin kein WPF-Experte, aber ich denke, es ist, weil Sie den falschen Weg gewählt haben.

<TextBlock Text="{Binding Path=MyCarProperty, Value=Manufacturer}" /> 

Update:.

<TextBlock Text="{Binding Source=MyCarProperty, Path=Manufacturer}" /> 
+0

Laut [this] (http://www.nbdtech.com/Free/WpfBinding.pdf) gibt es kein Wertattribut. –

+0

Übrigens: Die Bindung funktioniert, nur Wertupdates werden nicht weitergegeben. –

Verwandte Themen