如果值为空,则更改绑定

时间:2014-04-24 16:51:35

标签: c# wpf binding

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

我以此为例来解释:

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

""

我想如果名字为null或为空则会显示Name2,然后

Bill

Adam

我想做的另一种方式:

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

修改

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

4 个答案:

答案 0 :(得分:4)

我要创建一个新属性:

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

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

答案 1 :(得分: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; } }
}

答案 2 :(得分:1)

可以使用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>

如果您使用不同类型的绑定或来自不同来源的绑定等,这将更有用。对于一组名称,您可以将其与其他属性一起包装,如其他人所示。

答案 3 :(得分:0)

也许最简单的解决方案是添加自定义属性DisplayName,比如说,只为其编写代码Get()