我根据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更改时,它不会触发。
因此,我的问题是什么导致价值转换器触发?我假设当绑定数据发生变化时,是否有办法强制转换器在不同情况下触发?我甚至问了正确的问题吗?
答案 0 :(得分:4)
它不会触发,因为您已将其绑定到Selector
本身,而不是SelectedIndex
的{{1}}属性。 WPF将监视绑定到的路径中的每个属性,并在任何属性更改时更新值。 Selector
没有变化,Selector
是。
答案 1 :(得分:1)
我认为转换器可能是错误的方法。更好的解决方案是使用 RoutedCommand ,并且命令的 CanExecuted 方法检查您的SelectedIndex是否大于或等于0.
说了这么多,如果你仍然想要使用你的值转换器,你应该知道只要绑定源更新,转换器就会触发。您可以使用Binding上的 UpdateSourceTrigger 属性更改更新的行为。默认设置为 PropertyChanged ,但对于文本框,它设置为LostFocus(只要文本框失去焦点,绑定就会更新)。