在数据绑定 ObserveableCollection 中隐藏空元素

Hiding null elements in databound ObserveableCollection

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

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

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

如果 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>

如果整个 collection 项为空,您可以在 DataContext 为空时折叠 TreeViewItem

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