2013-08-14 14 views
10

Mam obiekt ViewModel ze złożonym typem właściwości i chcę powiązać mój widok z zagnieżdżoną właściwością tego obiektu.Powiadomienie o aktualizacji powiązania WPF dla właściwości zagnieżdżonej, gdy właściwość nadrzędna zmienia się

Mój ViewModel wdraża INotifyPropertyChanged (lub należy je wykonać w wersji BaseViewModel). Klasa własności nadrzędnej nie implementuje INotifyPropertyChanged.

Podczas aktualizacji wartości właściwości nadrzędnej zagnieżdżona właściwość nie jest aktualizowana. Czy możesz mi powiedzieć, w jaki sposób mogę zaimplementować tę funkcjonalność?

ViewModel

public class ViewModel : BaseViewModel 
{ 
    private Car _myCarProperty; 

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

      _myCarProperty = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

Oprawa w Widoku

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

Kiedy zmienić wartość MyCarProperty View nie aktualizuje.

Dzięki za pomoc!

Edit: OnPropertyChanged() realizacja

#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

Czy powiadomiłeś o tym dobro dziecka? –

+0

Klasa 'Car' nie implementuje' INotifyPropertyChanged'. Ale ja nie zmieniam własności 'Producenta', zmieniam właściwość' MyCarProperty', więc spodziewam się, że zdarzenie OnNotifyPropertyChanged wywoła aktualizację wartości?- zobacz moje zredagowane pytanie. –

+1

Czy możesz pokazać nam, w jaki sposób została zaimplementowana funkcja OnPropertyChanged? –

Odpowiedz

15

„Klasa samochodów nie realizuje INotifyPropertyChanged Ale nie zmienia własności producenta, zmienić właściwość MyCarProperty, a więc oczekiwać, że OnNotifyPropertyChanged Impreza wywołać aktualizację wartości? "

Nie, to nie spowoduje, że wartość zaktualizuje poziom w dół. Powiązania nie nasłuchują zmian właściwości na całej ścieżce, słuchają tylko obiektu, do którego są zobowiązani.

widzę kilka opcji z góry na głowie (w kolejności moje preferencje, kiedy napotkasz tego):

  1. wiążą się z samochodem, nie jest własnością sub, i stworzyć data template że wyświetlaczy co chcesz z tego.
  2. Ręcznie kopiuj wiązanie, wywołując UpdateTarget na jego numer BindingExpression, kiedy trzeba.

Wiem, że to wygląda jak jest dużo więcej do nauczenia się na trasie szablonu danych, ale obiecuję, że szablony danych okażą znacznie bardziej wydajne, skalowalne, utrzymaniu i użyteczna niż ręczne kopanie wiązania jak ty więcej pracy w WPF. (Ponadto, gdy je zrozumiesz, myślę, że są one w rzeczywistości bardziej skuteczne niż ręczne kopanie powiązań).

Powodzenia!

+0

Dzięki Greg! Wiem o szablonach danych i nie powinienem mieć z nimi żadnych problemów. Miałem ten sam problem jakiś czas temu i pamiętam, że znalazłem coś w przeszłości, które brzmi jak "głęboko wyglądające wiązania", ale myślę, że był to tylko "VeryObservableCollection", który znalazłem [tutaj] (http://stackoverflow.com/questions/6542035/listview-not-updated-poprawnie-with-observablecollection) - co nie pomaga w tym przypadku. Miałem nadzieję, że coś podobnego będzie istnieć. Ale idea szablonu danych jest idealna :) –

+0

Przepraszam, co? WPF nie słucha zmian wzdłuż ścieżki? Chciałbym wiedzieć o tym, zanim zacznę używać wszędzie łańcuchowych ścieżek. Hej, przestań. To działa! ;) –

+0

@Greg D, link "szablon danych" jest nieaktualny. Przepraszam, po prostu czuję się znudzony. –

3

Nie jestem ekspertem WPF, ale myślę, że to dlatego, że wybrał złą drogę.

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

zmiana:.

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

Według [this] (http://www.nbdtech.com/Free/WpfBinding.pdf) nie ma atrybutu wartości. –

+0

Przy okazji: The Binding działa, aktualizacje wartości nie są propagowane. –