【问题标题】:What causes a Value Converter to fire?是什么导致值转换器触发?
【发布时间】:2010-11-17 01:56:11
【问题描述】:

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

我创建了这个值转换器来处理任务并将它绑定到 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 改变时它不会触发。

因此,我的问题是什么导致值转换器触发?我认为这是绑定数据发生变化的时候,那么有没有办法强制转换器在不同的情况下触发?我问对了问题吗?

【问题讨论】:

  • 您能在 xaml 中显示您的绑定吗? SelectedIndex 是依赖属性,它应该可以工作
  • 绑定不是到 SelectedIndex 属性,而是到 ListBox 本身。不过,我想您已经找到了答案:Control 本身不是 dp,因此只要内容发生更改, onyl 可能就会起作用。

标签: wpf data-binding converter


【解决方案1】:

它不会触发,因为您已将其绑定到 Selector 本身,而不是 SelectorSelectedIndex 属性。 WPF 将监视您绑定到的路径中的每个属性,并在这些属性中的任何一个发生更改时更新值。 Selector 不变,SelectedIndex 不变。

【讨论】:

  • 当我阅读上面 ArsenMkrt 的评论时,我得出了同样的结论。我可以很容易地更改转换器:我认为这对任何 Selector 类型都有用,并且更具描述性,但你说的很有道理。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-04
    • 2017-12-26
    • 2011-01-18
    • 2013-11-26
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多