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?

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top