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
Control
implementaINotifyPropertyChanged
o
- Crea
Bar
a 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
)