Что приводит к срабатыванию преобразователя значений? - PullRequest
3 голосов
/ 05 августа 2009

Я устанавливаю свойство IsEnabled элемента управления в зависимости от того, есть ли SelectedIndex> = 0 в ListBox. Я могу сделать это в приведенном ниже коде, но я хотел создать конвертер значений для этого поведения, поскольку я часто это делаю.

Я создал этот конвертер значений для обработки задачи и привязал его к свойству 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
}

Конвертер вызывается только один раз, когда приложение загружено. Не срабатывает при изменении SelectedIndex.

Поэтому у меня вопрос: что вызывает срабатывание преобразователя значений? Я предполагаю, что это происходит, когда изменяются связанные данные, поэтому есть ли способ заставить преобразователь сработать в других обстоятельствах? Я даже задаю правильный вопрос?

Ответы [ 2 ]

4 голосов
/ 05 августа 2009

Он не сработает, потому что вы привязали его к Selector, а не к свойству SelectedIndex Selector. WPF будет отслеживать каждое свойство в пути, к которому вы привязываетесь, и обновлять значения, если любое из этих свойств изменяется. Selector не меняется, SelectedIndex есть.

1 голос
/ 05 августа 2009

Я думаю, что конвертер может быть неправильным способом для этого. Лучшим решением было бы использовать RoutedCommand , а метод CanExecuted команды проверяет, больше ли равно SelectedIndex 0.

Как бы то ни было, если вы все еще хотите использовать конвертер значений, вы должны знать, что конвертер срабатывает всякий раз, когда обновляется источник привязки. Вы можете изменить поведение обновления, используя свойство UpdateSourceTrigger в привязке. По умолчанию это значение равно PropertyChanged , но для текстовых полей это значение равно LostFocus (всякий раз, когда текстовое поле теряет фокус, привязка обновляется).

...