我有一个表,其中有两列ValueA
和ValueB
。我需要在网格中显示表格,但我需要显示ValueA
或ValueB
,但不是两者都显示。因此,如果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 };
}