隐藏数据绑定ObservableCollection中的null元素

时间:2015-01-17 14:25:48

标签: wpf data-binding observablecollection

我有多个ObservableCollection<T>使用与How to mix databound and static levels in a TreeView?中的实现类似的TreeView绑定到HierarchicalDataTemplate

我的问题是集合中的一个(或多个)元素有时可能为空,但它们仍然在TreeView中显示为空行,例如在此示例中:

Example of empty lines

除了从集合中删除它们之外,是否有一种隐藏这些元素的方法,以便它们在更改为非空值之前不会出现在用户界面中?

如果XAML的结构是相关的,那么这正是我正在做的事情:

<TreeView.Resources>
  <HierarchicalDataTemplate DataType="{x:Type local:FolderNode}" 
                            ItemsSource="{Binding Items}">
    <TextBlock Text="{Binding Path=DisplayName}" />
  </HierarchicalDataTemplate>

  <HierarchicalDataTemplate DataType="{x:Type local:ParentItem}">
    <HierarchicalDataTemplate.ItemsSource>
      <MultiBinding>
        <MultiBinding.Converter>
          <local:MultiCollectionConverter />
        </MultiBinding.Converter>
        <Binding Path="Children1" />
        <Binding Path="Children2" />
      </MultiBinding>
    </HierarchicalDataTemplate.ItemsSource>
    <TextBlock Text="{Binding Path=DisplayName}" />
  </HierarchicalDataTemplate>

  <HierarchicalDataTemplate DataType="{x:Type local:ChildItemWithChildCollection}" 
                            ItemsSource="{Binding}">
    <TextBlock Text="{Binding Path=DisplayName}" />
  </HierarchicalDataTemplate>

  <HierarchicalDataTemplate DataType="{x:Type local:ChildItemWithChild}" 
                            ItemsSource="{Binding Path=GrandChildren}">
    <TextBlock Text="{Binding Path=DisplayName}" FontWeight="Bold" />
  </HierarchicalDataTemplate>

  <DataTemplate DataType="{x:Type local:GrandChildItem}">
    <TextBlock x:Name="Item" Text="{Binding Path=DisplayName}" />
  </DataTemplate>

  <DataTemplate DataType="{x:Type local:ChildItemWithoutChildCollection}">
    <TextBlock Text="{Binding Path=DisplayName}" />
  </DataTemplate>

</TreeView.Resources>

1 个答案:

答案 0 :(得分:2)

如果整个集合项为null,则TreeViewItem为空时可以折叠DataContext

<TreeView>
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding}" Value="{x:Null}">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>