Cosa provoca l'attivazione di un convertitore di valore?
-
22-07-2019 - |
Domanda
Sto impostando una proprietà IsEnabled di un controllo in base al fatto che SelectedIndex > = 0 in un ListBox. Posso farlo nel codice dietro, ma volevo creare un convertitore di valore per questo comportamento poiché è qualcosa che faccio di frequente.
Ho creato questo convertitore di valori per gestire l'attività e associato alla proprietà IsEnabled:
[ValueConversion(typeof(Selector), typeof(bool))]
public class SelectorItemSelectedToBooleanConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null || !(value is Selector))
return null;
var control = value as Selector;
return control.SelectedIndex >= 0;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
Il convertitore viene chiamato solo una volta, quando l'applicazione viene caricata. Non si attiva quando il SelectedIndex cambia.
La mia domanda è quindi che cosa fa scattare un convertitore di valore? Suppongo che sia quando i dati associati cambiano, quindi c'è un modo per forzare il convertitore a sparare in circostanze diverse? Sto anche facendo la domanda giusta?
Soluzione
Non si attiva perché lo hai associato al Selector
stesso, non alla proprietà SelectedIndex
del Selector
. WPF monitorerà tutte le proprietà nel percorso a cui ti associ e aggiornerà i valori se una di tali proprietà cambia. Il Selector
non sta cambiando, il SelectedIndex
è.
Altri suggerimenti
Penso che un convertitore potrebbe essere il modo sbagliato di procedere. Una soluzione migliore sarebbe quella di utilizzare un RoutedCommand e il metodo CanExecuted del comando controlla se l'oggetto SelectedIndex è maggiore o uguale a 0.
Detto questo, se vuoi ancora usare il tuo convertitore di valore, dovresti sapere che il convertitore si attiva ogni volta che la fonte dell'associazione si aggiorna. Puoi modificare il comportamento dell'aggiornamento utilizzando UpdateSourceTrigger sul Binding. Per impostazione predefinita, questo è impostato su PropertyChanged , ma per le caselle di testo è impostato su LostFocus (ogni volta che la casella di testo perde lo stato attivo l'associazione viene aggiornata).