如果值为空,更改绑定。

3

如果值为空,我想更改绑定。

我举个例子来说明:


List<test> list = new List<test>();
list.Add(new test { Name1 = "Bill", Name2 = "Jack" });
list.Add(new test { Name1 = "", Name2 = "Adam" });
TestDataGrid.ItemsSource = list;

XAML

<DataGridTextColumn Header="Name" Binding="{Binding Name1}" />

在这种情况下将显示:
Bill

""

我希望如果名字为空或者未填写的话,显示Name2
Bill

Adam

另一种方式,我想要做的是:

<DataGridTextColumn Header="Name" Binding="if({Binding Name1} == null)
                                  {Binding Name2} else {Binding Name1}   " />

编辑

我觉得转换器可以解决这个问题,但是如果Name1为空,我无法发送Name2来更改值。

4个回答

4
我会创建一个新属性:

我会创建一个新属性:

public string Name { get { return string.IsNullOrEmpty(Name1) ? Name2 : Name1; } }

<DataGridTextColumn Header="Name" Binding="{Binding Name}" />

2

可以使用PriorityBinding来实现此功能,它会尝试多个绑定直到成功。返回UnsetValue的转换器被视为失败的绑定,因此您可以使用这样的转换器:

public class EmptyToUnsetConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        if (string.IsNullOrEmpty(value as string))
            return DependencyProperty.UnsetValue;

        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        return DependencyProperty.UnsetValue;
    }
}

并将其应用于每个绑定:

<DataGridTextColumn Header="Name">
    <DataGridTextColumn.Binding>
        <PriorityBinding>
            <Binding Path="Name1" Converter="{StaticResource EmptyToUnsetConverter}" />
            <Binding Path="Name2" Converter="{StaticResource EmptyToUnsetConverter}" />
        </PriorityBinding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>

如果您正在使用不同类型的绑定或来自不同来源的绑定,那么这将更有用。对于一组名称,您可以像其他人展示的那样将它们包装在另一个属性中。


1
您可以使用MultiBinding将两个值传递给转换器:
<DataGridTextColumn Header="Name" 
    <DataGridTextColumn.Binding>
        <MultiBinding Converter="{StaticResource NameConverter}">
            <Binding Path="Name1" />
            <Binding Path="Name2" />
        </MultiBinding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>

"NameConverter" 应该是一个实现了 IMultiValueConverter 接口的转换器,它接受多个输入值:
public class NameConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        string name1 = values.ElementAtOrDefault(0) as string, 
            name2 = values.ElementAtOrDefault(1) as string;
        return name1 ?? name2;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

MultiBinding是一个巧妙的方法,但在这种情况下,您可能会发现将另一个只读属性“DisplayName”添加到您的“test”类中更方便:

public class test
{
    public string Name1 { get; set; }
    public string Name2 { get; set; }

    public string DisplayName { get { return Name1 ?? Name2; } }
}

我会使用 ElementAtOrDefault(n) 而不是 Skip(n).FirstOrDefault()。在我看来,这样更简洁。 - Tim S.
@TimS。不错!我不知道“ElementAtOrDefault”。 - McGarnagle

0
也许最简单的解决方案是添加一个自定义属性 DisplayName,然后编写它的 Get() 代码?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接