Elementi selezionabili con la classe Selector
Selector è u una classe base astratta che non può essere quindi utilizzata direttamente, ma espone le logiche di selezione degli elementi, oltre a quelle presenti in ItemsControl. Definisce una attached property di nome IsSelected e gli eventi Selected e Unselected che vengono sfruttati dagli ItemContainer per mantenere le informazioni sul loro stato di selezione. Tramite esse il Selector conosce qual è l'elemento selezionato e ne deseleziona uno automaticamente al selezionarsi dall'altro, ed espone proprietà come SelectedItem e SelectedIndex per restituire o impostare l'elemento selezionato, mentre tramite SelectedValue restituisce o imposta il valore dell'item selezionato o da selezionare. Per risolvere il valore si appoggia ad un percorso di Binding che si specifica tramite SelectedValuePath. L'esempio seguente mostra come visualizzare in un TextBlock il valore dell'elemento selezionato con la ComboBox:
<ComboBox
x:Name="combo"
ItemsSource="{Binding}"
SelectedValuePath="@value"
DisplayMemberPath="@text">
</ComboBox>
<TextBlock Text="{Binding ElementName=combo,Path=SelectedValue}" />
Si noti l'uso della proprietà DisplayMemberPath che permette la creazione automatica di un Binding per ogni ItemContainer generato. L'immagine mostra il risultato di quanto scritto nel codice precedente che sfrutta le capacità di Binding per tenere agganciati la ComboBox e la TextBlock:

Da codice, per intercettare quando l'elemento selezionato cambia è possibile inoltre sfruttare l'evento SelectionChanged che negli argomenti passati contiene gli elementi che hanno perso la selezione e gli elementi che l'hanno ricevuta.
L'ultima proprietà, ma molto importante, è IsSynchronizedWithCurrentItem. Se impostata su true mantiene sincronizzato l'item con il CurrentItem della CollectionView associata alla sorgente dati e questo permette da una parte di disaccoppiare l'eventuale codice codebehind, lavorando sulla vista e non sul Selector, dall'altra di effettuare Binding a cascata permettendo scenari di master/details.
Quando si desidera caricare dati in funzione di un altro elemento, come nell'esempio precedente, si possono scegliere due vie. La prima è vincolarsi al controllo di selezione e interrogare la sua proprietà SelectedValue, mentre la seconda si affida alle CollectionView, sfruttando appunto la sincronizzazione. L'esempio precedente può quindi essere modificato in questo modo:
<ComboBox
ItemsSource="{Binding}"
IsSynchronizedWithCurrentItem="True"
DisplayMemberPath="@text">
</ComboBox>
<TextBlock Text="{Binding XPath=@value}" />
Il risultato è il medesimo, ma il motore di Binding sa distinguere che la ComboBox vuole tutta la collezione di nodi item, mentre il TextBlock necessita del nodo corrente.
Contenuti dell'articolo
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.






Difficoltà
Utilità
Contenuti
Stampa
Download 


10annidi.ASPItalia.com: iscriviti alla competizione e vinci fantastici premi ogni mese!
