Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多重绑定:两列到一列_C#_Wpf_Xaml_.net 3.5_Multibinding - Fatal编程技术网

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。