我有一个集合数据绑定到ListBox
。我想要做的是根据集合成员的某些属性是否存在来显示一些UI。
E.g:
public class Widget
{
public string foo;
public string bar;
}
public ObservableCollection<Widget> Stuff;
XAML:
<ListBox ItemsSource="{Binding Stuff}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding foo}"
Visiblity="{Binding
(foo != null ? Visibility.Visible : Visibility.Collapsed)
}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
请注意Visibility
上的TextBlock
属性。显然这不受支持,但它应该让你知道我想做什么。
一种可能的解决方案是我可以向窗口小部件添加一个属性,如下所示:
public Visibility has_foo;
然后:
... Visibility="{Binding has_foo}" ...
但是必须生成这些附加属性似乎很尴尬。
我怀疑有更好的方法。在那儿?你会怎么做?
感谢。
答案 0 :(得分:2)
创建一个值转换器。像
这样的东西public class NullToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value != null ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后添加类似
的内容<YourUserControl.Resources>
<NullToVisibilityConverter x:Key="NullToVisibilityConverter" />
</YourUserControl.Resources>
<ListBox ItemsSource="{Binding Stuff}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding foo}"
Visiblity="{Binding foo,
Converter={StaticResource NullToVisibilityConverter}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
显然我没有实现ConvertBack(不确定你是否能够转换回来)但在这个例子中你不应该需要它。