0

我有一个有两列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 执行此操作?

4

2 回答 2

1

如果我理解得很好,你只需要在你的类中增加一个属性,比如 ValueAorB。使用 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 方法(永远不会被调用):

可能你不需要二传手。想想看。两种方式会更复杂,你甚至不需要它。此外,我认为如果您尝试以一种方式进行,则可以使用自己的方法来完成。

于 2013-05-23T10:00:45.067 回答
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 };
    }
于 2013-05-23T10:19:04.657 回答