Immagina che venga creato Control .
Ha un po 'di DependencyProperties e ci sono alcune proprietà che dipendono dal DependencyProperties , ma non ha bisogno di essere visto o aggiornato dall'esterno.
Ad esempio : Foo è un DependencyProperty (che può essere sia letto che scritto dall'esterno) e Bar è una proprietà comune che verrà aggiornata quando ( e solo quando ) Foo cambia.
public class MyControl : Control
{
private static DependencyProperty FooProperty =
DependencyProperty.Register("Foo",
typeof(int),
typeof(MyControl),
new PropertyMetadata(FooChanged));
private static void FooChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyControl changedObject = d as MyControl;
changedObject.Bar++;
}
// The dependency property
public int Foo { get; set; }
// The property that is changed (only) when the dependency property changes
public int Bar { get; private set; }
}
Tuttavia, il valore di Bar viene visualizzato sullo schermo (viene stabilita una Binding nel modello del controllo). Ma poiché Bar è not a DependencyProperty non viene inviata alcuna notifica per dire che il suo valore è cambiato.
Vedo due opzioni per risolvere questo problema (ma sono aperto ai suggerimenti).
- Rendi il mio
ControlimplementaINotifyPropertyChanged
o
- Crea
Bara sola letturaDependencyProperty
Quali sono i pro e i contro di ciascun approccio? Come dovrei proceid?
È una cattiva pratica implementare INotifyPropertyChanged su Control ?
@EDIT
Questa domanda è stata sollevata durante la creazione di un controllo che filtra e visualizza una raccolta di giochi.
I dati di questa collezione sono "costanti" (i giochi sono caricati con l'app e non cambiano alla fine dell'esecuzione). Tuttavia, l'utente può applicare i filtri a questa raccolta (ad esempio, solo visualizzando i giochi che sono in inglese)
Come puoi immaginare, i filtri sono Dependency Properties , mentre la collezione di giochi è una proprietà semplice, che non ero sicuro di dover trasformare in'DependencyProperty' (dato che sarebbe sempre lo stesso, filtrato solo in base al ComboBoxes )