如果值为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
来更改值
答案 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()
?