Condividi tramite


Eventi di modifica delle proprietà (WPF .NET)

Windows Presentation Foundation (WPF) definisce diversi eventi generati in risposta a una modifica del valore di una proprietà. Spesso la proprietà è una proprietà di dipendenza. L'evento stesso può essere un evento indirizzato o un evento CLR (Common Language Runtime) standard, a seconda che l'evento debba essere indirizzato attraverso un albero degli elementi o si verifichi solo sull'oggetto in cui è stata modificata la proprietà. Quest'ultimo scenario si applica quando una modifica di proprietà è rilevante solo per l'oggetto in cui il valore della proprietà è stato modificato.

Prerequisiti

Questo articolo presuppone una conoscenza di base delle proprietà di dipendenza e che tu abbia letto la Panoramica degli eventi indirizzati .

Identificazione di un evento di modifica della proprietà

Non tutti gli eventi che segnalano una modifica della proprietà vengono identificati in modo esplicito come evento di modifica della proprietà tramite il relativo modello di firma o denominazione. La documentazione dell'SDK fa riferimento incrociato alle proprietà con eventi e indica se un evento è direttamente associato a una modifica del valore della proprietà.

Alcuni eventi usano un tipo di dati e un delegato specifici per eventi di modifica delle proprietà. Ad esempio, gli eventi RoutedPropertyChanged e DependencyPropertyChanged hanno firme specifiche. Questi tipi di evento vengono illustrati nelle sezioni seguenti.

Eventi di RoutedPropertyChanged

Gli eventi RoutedPropertyChanged hanno dati di evento RoutedPropertyChangedEventArgs<T> e un RoutedPropertyChangedEventHandler<T> delegato. Sia i dati dell'evento che il delegato hanno un parametro di tipo generico T. Specificare il tipo effettivo della proprietà modificata quando si definisce il gestore. I dati dell'evento contengono le proprietà OldValue e NewValue, il cui tipo di runtime corrisponde alla proprietà modificata.

La parte "Routed" del nome indica che l'evento di modifica della proprietà viene registrato come un evento instradato. Il vantaggio di un evento di routing di cambiamento di proprietà è che gli elementi padre vengono notificati ogni volta che le proprietà degli elementi figlio cambiano. Ciò significa che l'elemento di primo livello di un controllo riceve eventi di modifica della proprietà quando il valore di una delle relative parti composite cambia. Per esempio, supponiamo di creare un controllo che incorpora un controllo RangeBase, come ad esempio un Slider. Se la proprietà Value cambia nella parte del dispositivo di scorrimento, è possibile gestire tale modifica nel controllo padre anziché nella parte.

Evitare di usare un gestore eventi di modifica della proprietà per convalidare il valore della proprietà, perché non è questo lo scopo progettuale della maggior parte degli eventi di modifica delle proprietà. In genere, l'evento di modifica della proprietà viene fornito in modo da poter rispondere alla modifica del valore in altre aree logiche del codice. La modifica del valore della proprietà all'interno del gestore dell'evento di modifica della proprietà non è consigliabile e può causare una ricorsione indesiderata a seconda dell'implementazione del gestore.

Se la tua proprietà è una proprietà di dipendenza personalizzata o se stai lavorando con una classe derivata in cui hai definito il codice di istanziazione, il sistema di proprietà WPF offre un modo migliore per tenere traccia delle modifiche delle proprietà. In questa procedura si utilizzano i callback predefiniti del sistema di proprietà CoerceValueCallback e PropertyChangedCallback. Per altre informazioni su come usare il sistema di proprietà WPF per la convalida e la coercizione, vedere richiamate delle proprietà di dipendenza e convalida e proprietà di dipendenza personalizzate.

Eventi di cambiamento di DependencyProperty

Gli eventi DependencyPropertyChanged contengono dati dell'evento DependencyPropertyChangedEventArgs e un delegato DependencyPropertyChangedEventHandler. Questi eventi sono eventi CLR standard, non eventi indirizzati. DependencyPropertyChangedEventArgs è un tipo insolito di report dei dati degli eventi perché non deriva da EventArgs ed è una struttura, non una classe.

Un esempio di evento DependencyPropertyChanged è IsMouseCapturedChanged. DependencyPropertyChanged eventi sono leggermente più comuni rispetto agli eventi RoutedPropertyChanged.

Analogamente ai dati dell'evento RoutedPropertyChanged, i dati dell'evento DependencyPropertyChanged contengono le proprietà OldValue e NewValue. Per i motivi menzionati in precedenza , evitare di usare un gestore eventi di modifica della proprietà per cambiare nuovamente il valore della proprietà.

Trigger di proprietà

Un concetto strettamente correlato a un evento di modifica della proprietà è un trigger di proprietà. Un trigger di proprietà viene creato all'interno di uno stile o di un modello. Il trigger di proprietà consente di creare un comportamento condizionale in base al valore della proprietà a cui viene assegnato il trigger.

La proprietà su cui agisce un trigger di proprietà deve essere una proprietà di dipendenza. Può essere e spesso è una proprietà di dipendenza di sola lettura. Se una proprietà di dipendenza esposta da un controllo ha un nome che inizia con "Is", questo è un buon indicatore che indica che la proprietà è stata almeno parzialmente progettata per essere un trigger di proprietà. Le proprietà con questa denominazione sono spesso proprietà di dipendenza di sola lettura Boolean, dove lo scenario principale per la proprietà è la segnalazione dello stato del controllo. Se lo stato di controllo influisce sull'interfaccia utente in tempo reale, la proprietà di dipendenza è un candidato per un trigger di proprietà.

Alcune proprietà di dipendenza hanno un evento dedicato alla modifica della proprietà. Ad esempio, IsMouseCaptured ha l'evento di modifica della proprietà IsMouseCapturedChanged. La proprietà IsMouseCaptured è di sola lettura e il relativo valore viene modificato dal sistema di input. Il sistema di input genera l'evento IsMouseCapturedChanged in ogni modifica in tempo reale.

Limitazioni dell'attivatore di proprietà

Rispetto a un vero evento di modifica della proprietà, i trigger di proprietà presentano alcune limitazioni.

La proprietà e il trigger funzionano seguendo una logica di corrispondenza esatta, in cui si specificano un nome di proprietà e un valore preciso che attiveranno il trigger. Un esempio è <Setter Property="IsMouseCaptured" Value="true"> ... </Setter>. La sintassi del trigger di proprietà limita l'uso della maggior parte dei trigger alle proprietà Boolean o a quelle che richiedono un valore di enumerazione dedicato. L'intervallo di valori possibili deve essere gestibile, in modo da poter definire un trigger per ogni caso. In alcuni casi i trigger di proprietà esistono solo per valori speciali, ad esempio quando un conteggio degli elementi raggiunge lo zero. Non è possibile impostare un singolo trigger che si attivi quando il valore di una proprietà cambia da un valore specifico, ad esempio zero. Invece di usare più trigger per tutti i casi diversi da zero, considera di implementare un gestore eventi o un comportamento predefinito che ritorna allo stato precedente ogni volta che il valore è diverso da zero.

La sintassi del trigger di proprietà è analoga a un'istruzione "if" nella programmazione. Se la condizione del trigger è true, il "corpo" del trigger di proprietà è "run". Il "corpo" di un trigger di proprietà non è codice, è il markup. Tale markup è limitato all'uso di uno o più elementi Setter per impostare altre proprietà dell'oggetto in cui viene applicato lo stile o il modello.

Quando la condizione "if" di un trigger su una proprietà ha un'ampia gamma di valori possibili, è consigliabile impostare lo stesso valore della proprietà su un valore predefinito utilizzando un Setter all'esterno del trigger. In questo modo, il setter all'interno del trigger avrà la precedenza quando la condizione del trigger è true; al contrario, il Setter all'esterno del trigger avrà la precedenza.

I trigger di proprietà sono utili per gli scenari in cui una o più proprietà di aspetto devono cambiare in base allo stato di un'altra proprietà nello stesso elemento.

Per altre informazioni sui trigger di proprietà, vedere Stile e template.

Vedere anche