我的表格有两列ValueA
和ValueB
。我需要在网格中显示表格,但我需要显示ValueA
或ValueB
,但不能同时显示两者。因此,如果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执行此操作?
答案 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 };
}