WPF如何让转换器对多个字段中的更改做出反应

时间:2014-03-08 23:37:27

标签: wpf xaml binding converter

我的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>

但是,如果我只是绑定到数据上下文(不指定Path),则在数据上下文更改时调用它,但在Location或IsUnsavedChanges更改时不调用。

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

1 个答案:

答案 0 :(得分: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 "";
    }
}