2013-08-14 17 views
10

Ho un ViewModel con un tipo di proprietà complessa e desidero associare la mia vista a una proprietà nidificata di questo oggetto.Notifica di aggiornamento del binding WPF per la proprietà nidificata quando la proprietà parent cambia

My ViewModel sta implementando INotifyPropertyChanged (oppure è necessario estenderlo a BaseViewModel). La classe della proprietà padre non sta implementando INotifyPropertyChanged.

Quando si aggiorna il valore della proprietà padre, la proprietà nidificata non si aggiorna. Puoi dirmi come posso implementare questa funzionalità?

ViewModel

public class ViewModel : BaseViewModel 
{ 
    private Car _myCarProperty; 

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

      _myCarProperty = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

rilegatura in vista

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

Quando cambio il valore della MyCarProperty View non si aggiorna.

Grazie per qualsiasi aiuto!

Edit: OnPropertyChanged() implementazione

#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

hai avvisato la proprietà del bambino? –

+0

La classe 'Car' non sta implementando' INotifyPropertyChanged'. Ma non sto cambiando la proprietà 'Manufacturer', cambio la proprietà' MyCarProperty', e quindi mi aspetto che l'evento OnNotifyPropertyChanged attiverà l'aggiornamento del valore?- per favore vedi la mia domanda modificata –

+1

Puoi mostrarci come è implementato OnPropertyChanged? –

risposta

15

"La classe Auto non sta attuando INotifyPropertyChanged ma non sto modificando la proprietà del produttore, a cambiare la proprietà MyCarProperty, e quindi mi aspetto che l'evento sarà OnNotifyPropertyChanged attivare l'aggiornamento del valore? "

No, non attiverà l'aggiornamento del valore a un livello inferiore. I binding non ascoltano le modifiche alle proprietà per un intero percorso, ascoltano solo l'oggetto a cui sono associati.

vedo un paio di opzioni di fuori della parte superiore della mia testa (in ordine di mia preferenza, quando mi imbatto in questo):

  1. Bind alla macchina, non la proprietà sub, e creare un data template che visualizza cosa vuoi da fuori.
  2. Rilancia manualmente l'associazione chiamando UpdateTarget sul suo BindingExpression quando è necessario.

So che sembra che ci sia molto di più da imparare sulla rotta modello di dati, ma vi prometto che modelli di dati dimostreranno enormemente più potente, scalabile, gestibile e utile di calci manualmente attacchi, come si lavorare di più in WPF. (Inoltre, una volta che li hai capiti, penso che siano in realtà in meno di lavoro rispetto a quelli di kicking manuale).

Buona fortuna!

+0

Grazie Greg! Conosco i modelli di dati e non dovrei avere problemi con loro. Ho avuto lo stesso problema un po 'di tempo fa e ricordo di aver trovato qualcosa nel passato che assomiglia a "legature dall'aspetto profondo", ma suppongo che fosse solo il 'VeryObservableCollection' che ho trovato [qui] (http://stackoverflow.com)/questions/6542035/listview-not-updated-correct-with-observablecollection) - che non aiuta a risolvere questo problema. Speravo che esistesse qualcosa di simile. Ma l'idea del modello di dati è perfetta :) –

+0

Scusa, cosa? WPF non ascolta le modifiche lungo il percorso? Vorrei saperlo prima di iniziare a usare sentieri incatenati ovunque. Ehi, fermati. Funziona! ;) –

+0

@Greg D, il collegamento "modello dati" è obsoleto. Scusa, mi sento annoiato. –

3

Io non sono un esperto di WPF, ma credo che sia perché hai scelto la strada sbagliata.

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

aggiornamento:.

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

In base a [questo] (http://www.nbdtech.com/Free/WpfBinding.pdf) non esiste un attributo di valore. –

+0

A proposito: Il collegamento funziona, solo gli aggiornamenti del valore non vengono propagati. –

Problemi correlati