C# 多重绑定:两列到一列
我有一个表,它有两列C# 多重绑定:两列到一列,c#,wpf,xaml,.net-3.5,multibinding,C#,Wpf,Xaml,.net 3.5,Multibinding,我有一个表,它有两列ValueA和ValueB。我需要在网格中显示表格,但我需要显示ValueA或ValueB,但不能同时显示两者。因此,如果ValueA没有值,则显示ValueB,反之亦然。当用户在列中输入值时,只应更新ValueA。因此,ValueB是一种默认值(它在程序的另一部分中更新) 我曾尝试使用多绑定解决此问题,但只显示了值。用户输入到网格的值总是被原始值覆盖 我创建了一个名为ValueAValueBConverter的转换器,其转换方法如下: public object Conve
ValueA
和ValueB
。我需要在网格中显示表格,但我需要显示ValueA
或ValueB
,但不能同时显示两者。因此,如果ValueA
没有值,则显示ValueB
,反之亦然。当用户在列中输入值时,只应更新ValueA
。因此,ValueB
是一种默认值(它在程序的另一部分中更新)
我曾尝试使用多绑定解决此问题,但只显示了值。用户输入到网格的值总是被原始值覆盖
我创建了一个名为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;
}
<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>
和ConvertBack方法(从未调用):
绑定列的XAML如下所示:
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;
}
<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这样做?如果我理解得很清楚,您只需要在类中再添加一个属性,比如ValueAorB。有一个getter可以完成转换器所做的工作,而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方法(从未调用):
也许你不需要二传手。想想看。双向将更加复杂,你甚至不需要它。此外,我认为如果您试图以一种方式实现,您可以使用自己的方法来实现。您的代码工作正常,只需更改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 };
}
这个解决方案有效。从未调用ConvertBack方法不是故意的,因此我还需要添加一个setter。