如果绑定值为空,则隐藏项目?

时间:2016-09-03 10:31:23

标签: c# wpf

我这样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;

每个文本块都会重复此错误,而我的错误是什么?

2 个答案:

答案 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>