【问题标题】:WPF How to have converter react to changes in multiple fieldsWPF 如何让转换器对多个字段的变化做出反应
【发布时间】:2014-04-12 03:51:10
【问题描述】:

我的 MainWindow 的数据上下文是一个类 ViewModel:

视图模型:

  • 位置
  • IsUnsavedChanges

我希望 MainWindow 的标题基于转换器。转换器应接收 ViewModel 类,但应在 Location 或 IsUnsavedChanges 更改时调用它。

当我希望转换器绑定到一个对象时,我可以使用什么技术,同时对该对象字段的变化做出反应?

目前我可以绑定到数据上下文中的 Location 字段,并且效果很好。请参见 MainWindow.xaml 中的以下内容:

<Window.Resources>
    <my:MainWindowTitleConverter x:Key="titleConverter"/>
</Window.Resources>

<Window.Title>
    <Binding Converter="{StaticResource titleConverter}" Path="Location"/>
</Window.Title>

但是,如果我只是绑定到数据上下文(未指定路径),那么它会在数据上下文更改时调用,而不是在 Location 或 IsUnsavedChanges 更改时调用。

我可以通过在 ViewModel 中添加一个新的 Title 字段并在 Location、IsUnsavedChanges 等字段发生更改时通知它已更改来解决此问题,但我觉得这有点 hacky。

【问题讨论】:

  • 查看多重绑定和IMultiValueConverter

标签: wpf xaml binding converter


【解决方案1】:

正如我在评论中提到的,使用MultiBinding 您可以绑定窗口Title 以响应多个属性,例如:

<Window.Resources>
    <my:MultiValueTitleConverter x:Key="titleConverter"/>
</Window.Resources>
<Window.Title>
    <MultiBinding Converter="{StaticResource MultiValueConverter}">
        <Binding Path="Location" />
        <Binding Path="IsUnsavedChanges" />
    </MultiBinding>
</Window.Title>

此外,您需要有实现IMultiValueConverter 的转换器类以用于多重绑定。例如:

public class MultiValueTitleConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (values.Length > 1 && values[0] is string && values[1] is bool)
        {
            var location= values[0] as string;
            var isUnsavedChanges= values[1] as bool;
            return "some value based on two values above";
        } 
        return "";
    }
}

【讨论】:

  • 谢谢!在发现我可以绑定到与您的示例类似的任意数量的对象后,我选择不绑定到 ViewModel,而是直接绑定到它的一堆字段。
  • 同意,不再需要直接通过多重绑定传递 ViewModel。在这个答案中更新了转换器示例。
猜你喜欢
  • 2018-10-14
  • 2020-05-11
  • 2021-05-16
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
相关资源
最近更新 更多