导致价值转换器触发的原因是什么?

时间:2009-08-05 16:09:54

标签: wpf data-binding converter

我根据ListBox中的SelectedIndex> = 0来设置控件的IsEnabled属性。我可以在后面的代码中执行此操作,但我想为此行为创建一个值转换器,因为它是我经常做的事情。

我创建了这个Value Converter来处理任务并将其绑定到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
}

加载应用程序时,只调用一次Converter。当SelectedIndex更改时,它不会触发。

因此,我的问题是什么导致价值转换器触发?我假设当绑定数据发生变化时,是否有办法强制转换器在不同情况下触发?我甚至问了正确的问题吗?

2 个答案:

答案 0 :(得分:4)

它不会触发,因为您已将其绑定到Selector本身,而不是SelectedIndex的{​​{1}}属性。 WPF将监视绑定到的路径中的每个属性,并在任何属性更改时更新值。 Selector没有变化,Selector是。

答案 1 :(得分:1)

我认为转换器可能是错误的方法。更好的解决方案是使用 RoutedCommand ,并且命令的 CanExecuted 方法检查您的SelectedIndex是否大于或等于0.

说了这么多,如果你仍然想要使用你的值转换器,你应该知道只要绑定源更新,转换器就会触发。您可以使用Binding上的 UpdateSourceTrigger 属性更改更新的行为。默认设置为 PropertyChanged ,但对于文本框,它设置为LostFocus(只要文本框失去焦点,绑定就会更新)。