Perché l’aggiornamento dell’associazione non implementa INotifyPropertyChanged?

Ho creato un ViewModel e ho associato la sua proprietà a due caselle di testo sull’interfaccia utente. Il valore dell’altra casella di testo cambia quando cambio il valore di first e focus out della textbox ma non sto implementando INotifyPropertyChanged. Come funziona?

Di seguito è riportato XAML

         

E seguente è il mio ViewModel

 class ViewModel { public string Name { get; set; } } 

L’ho provato, hai ragione. Ora l’ho cercato sul web e ho trovato questo .

Ci scusiamo tanto per rispondere, in realtà ci troviamo di fronte a un altro aspetto nascosto di WPF , ovvero il motore di associazione dati di WPF legherà i dati all’istanza di PropertyDescriptor che avvolge la proprietà di origine se l’object di origine è un object CLR semplice e non implementa Interfaccia INotifyPropertyChanged . E il motore di associazione dati tenterà di sottoscrivere l’evento modificato proprietà tramite il metodo PropertyDescriptor.AddValueChanged (). E quando l’elemento associato ai dati di destinazione modifica i valori delle proprietà, il motore di associazione dei dati chiamerà il metodo PropertyDescriptor.SetValue () per trasferire il valore modificato alla proprietà source e simultaneamente genererà l’evento ValueChanged per notificare altri sottoscrittori (in questo caso, gli altri abbonati saranno i TextBlocks all’interno del ListBox.

E se stai implementando INotifyPropertyChanged, sei pienamente responsabile di implementare la notifica di modifica in ogni setter delle proprietà che devono essere associate ai dati dell’interfaccia utente. In caso contrario, la modifica non sarà sincronizzata come previsto.

Spero che questo chiarisca un po ‘le cose.

Quindi in pratica puoi farlo, purché sia ​​un semplice object CLR. Abbastanza pulito ma totalmente inaspettato – e ho fatto un po ‘di lavoro WPF negli anni passati. Non smetti mai di imparare cose nuove, vero?

Come suggerito da Hasan Khan, ecco un altro link a un articolo piuttosto interessante su questo argomento.

Nota questo funziona solo quando si utilizza l’associazione . Se aggiorni i valori dal codice , la modifica non verrà notificata . […]

WPF utilizza la class PropertyInfo molto più leggera durante il binding. Se si implementa esplicitamente INotifyPropertyChanged, tutto ciò che WPF deve fare è chiamare il metodo PropertyInfo.GetValue per ottenere l’ultimo valore. Questo è un po ‘meno lavoro che ottenere tutti i descrittori. I descrittori finiscono per costare nell’ordine di 4x la memoria delle classi di informazioni sulle proprietà. […]

Implementare INotifyPropertyChanged può essere un bel po ‘di noioso lavoro di sviluppo. Tuttavia, è necessario pesare tale lavoro contro il footprint di runtime (memoria e CPU) dell’applicazione WPF. L’implementazione di INPC farà risparmiare tempo alla CPU e alla memoria di runtime .

Posso spiegare perché la proprietà viene aggiornata quando cambia lo stato UpdateSourceTrigger : tutti i Binding hanno una proprietà UpdateSourceTrigger che indica quando la proprietà di origine verrà aggiornata. Il valore predefinito per questo è definito su ogni DependencyProperty e per la proprietà TextBox.Text è impostato su LostFocus , il che significa che la proprietà verrà aggiornata quando il controllo perde lo stato TextBox.Text .

Credo che la risposta di UrbanEsc spieghi perché il valore è stato aggiornato

Ho appena scoperto che questo funziona anche in WinForms, kinda: /

 public class Test { public bool IsEnabled { get; set; } } var test = new Test(); var btn = new Button { Enabled = false, Text = "Button" }; var binding = new Binding("Enabled", test, "IsEnabled"); btn.DataBindings.Add(binding); var frm = new Form(); frm.Controls.Add(btn); test.IsEnabled = true; Application.Run(frm); 

Stranamente però, questo non disabilita il pulsante:

 btn.Enabled = false; 

Questo fa:

 test.IsEnabled = false;