多重绑定:两列到一列

时间:2013-05-23 09:40:44

标签: c# wpf xaml .net-3.5 multibinding

我的表格有两列ValueAValueB。我需要在网格中显示表格,但我需要显示ValueAValueB,但不能同时显示两者。因此,如果ValueA没有值,则会显示ValueB,反之亦然。当用户向列输入值时,只应更新ValueA。所以ValueB有一个默认值(它在程序的另一部分更新)。

我尝试使用MultiBinding解决此问题,但我只是设法显示值。用户输入网格的值总是被原始值覆盖。

我创建了一个名为ValueAValueBConverter的转换器,其转换方法如下:

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    if (values[0] != DependencyProperty.UnsetValue && values[0] != null && !string.IsNullOrEmpty(values[0].ToString()))
    {
        Debug.WriteLine("values 0: " + values[0]);
        return values[0].ToString();
    }
    if (values[1] != DependencyProperty.UnsetValue && values[1] != null && !string.IsNullOrEmpty(values[1].ToString()))
    {
        Debug.WriteLine("values 1: " + values[1]);
        return values[1].ToString();
    }

    return null;
}

一个ConvertBack方法(永远不会被调用):

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
    return new object [] { value, value };
}

绑定列的XAML如下所示:

<toolkit:DataGridTextColumn Width="2*" Header="{x:Static localProperties:Resources.TValuesAB}">
    <toolkit:DataGridTextColumn.Binding>
        <MultiBinding Converter="{StaticResource myValueAValueBConverter}" Mode="TwoWay">
            <Binding Path="ValueA" UpdateSourceTrigger="PropertyChanged" />
            <Binding Path="ValueB" UpdateSourceTrigger="PropertyChanged" />
        </MultiBinding>
    </toolkit:DataGridTextColumn.Binding>
</toolkit:DataGridTextColumn>

我应该在ViewModel中执行此操作(我们使用的是MVVM模式)还是有其他方法可以使用XAML执行此操作?

2 个答案:

答案 0 :(得分:1)

如果我很好理解,你只需要在你的课堂上有一个属性,比如ValueAorB。使用吸气器可以完成转换器的工作,并且设置器更复杂。

public object ValueAorB
{
    get
    {
        if (values[0] != DependencyProperty.UnsetValue && values[0] != null && !string.IsNullOrEmpty(values[0].ToString()))
        {
            Debug.WriteLine("values 0: " + values[0]);
            return values[0].ToString();
        }
        if (values[1] != DependencyProperty.UnsetValue && values[1] != null && !string.IsNullOrEmpty(values[1].ToString()))
        {
            Debug.WriteLine("values 1: " + values[1]);
            return values[1].ToString();
        }
    }
}

不要忘记让它引发PropertyChanged事件。

随之而来:

  

一个ConvertBack方法(永远不会被调用):

可能你不需要一个二传手。想一想。双向会更复杂,你甚至不需要它。另外,如果你试图以一种方式做到这一点,我认为你可以用你自己的方法来做。

答案 1 :(得分:0)

您的代码工作正常,只需更改ConvertBack方法以将值返回到ValueA,并将Binding.DoNothing更改为ValueB。所以用户只能更改ValueA:

 public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        return new object[] { value, Binding.DoNothing };
    }