我这样ListBox
:
<ListBox VerticalAlignment="Stretch"
ItemsSource="{Binding EventInfo}">
在其中我有一个带有TextBlock列表的DataTemplate
:
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="20"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Text="Event:" FontWeight="Bold" Grid.Column="0" Grid.Row="0"/>
<TextBlock Text="{Binding Name}" FontWeight="Bold" Grid.Column="1" Grid.Row="0"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我需要做的是隐藏文本块,例如,绑定值为null
。我把这些东西联系起来了:
Event: foo
但在某些情况下,Name
为空,我需要同时隐藏TextBlock
Event
和绑定,可以这样做吗?
更新
我试图在xaml中做这个纯粹的:
<Style TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="Text" Value="">
<Setter Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="Text" Value="{x:Null}">
<Setter Property="Visibility" Value="Collapsed" />
</Trigger>
</Style.Triggers>
</Style>
问题是应用程序处于中断模式并且我得到了xaml错误:
System.Windows.Data错误:40:BindingExpression路径错误:&#39;名称&#39;在&#39; object&#39;上找不到的属性&#39;&#39;样式&#39; (的HashCode = 7)&#39;
每个文本块都会重复此错误,而我的错误是什么?
答案 0 :(得分:1)
虽然你可以在这里使用NullToVisibilityConverter,但你可能会发现ListBox中存在一个可疑的空白,其中(折叠的)TextBlock应该是由于ListBoxItemContainer周围的填充。更糟糕的是,这个&#34;差距&#34;仍然可以由用户选择。
虽然这些问题也可以使用类似于NullToVisbilityConverter的方法解决,但我非常鼓励您从ViewModel中的EventInfo中过滤掉这些值,其中应该的逻辑应该呈现给应该找到用户(但不包括应该如何)。
答案 1 :(得分:1)
您可以将可见性绑定到属性
Visibility="{Binding IsVisibleName, Converter={StaticResource myBoolToVisibilityConverter}}
通过静态bool转换器
<local:BooleanToVisibiltyConverter x:Key="myBoolToVisibilityConverter" />
表示必须/可以隐藏的所有元素。
然后转换器将true转换为可见
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
bool isVisible = (bool)value;
return (isVisible ? Visibility.Visible : Visibility.Collapsed);
}
然后,您会在符合条件时设置它们,例如(这是一般性的想法,我不知道您的具体细节)在Name setter中(您必须配置所有条件)其他触发器也是如此)
public string Name
{
get { return name;}
set
{
name = value; OnPropertyChanged("Name");
IsVisibleName = name != null; IsVisibleEvent = event != null && name != null;
}
}
在纯XAML中有数据触发器
<Style.Triggers>
<DataTrigger Binding="{Binding SomeValue}" Value=" x:Null ">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>