多重绑定:两列到一列



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

我试图用MultiBinding解决这个问题,但我只设法显示的值。用户输入到网格中的值总是被原始值覆盖。

我已经创建了一个名为ValueAValueBConverter的转换器,它有一个这样的Convert方法:

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?

如果我没理解错的话,您只需要在类中再添加一个属性,比如valueorb。getter可以完成Converter所做的工作,而setter则稍微复杂一些。

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方法(永远不会被调用):

也许你不需要setter。想想看。双向会更复杂,你甚至不需要它。另外,我认为如果你想让它变成一种方式,你可以用你自己的方法来做。

您的代码工作得很好,只是更改ConvertBack方法将值返回到ValueA和Binding。不要做任何有价值的事。所以用户只能修改ValueA:

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

相关内容

  • 没有找到相关文章

最新更新