在TreeView上绑定';s项目

本文关键字:项目 TreeView 绑定 | 更新日期: 2023-09-27 18:20:18

我有一个treeView和一个stackpanel,其中包含"没有项目"的消息。所以,如果treeView的项目不是空的,我想隐藏面板。

这是我的XAML示例:

<TreeView Name="treeDocs" Grid.ColumnSpan="2"/>
<StackPanel Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Center" 
Margin="51,20,51,0" Name="stkNoDocs"
Visibility="{Binding ElementName=treeDocs, Path=Items,
Converter={StaticResource ResourceKey=ItemsToVisibilityConverter}}">

这是我的转换器的转换方法:

public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
    return ((ItemCollection)value).Count == 0 ? Visibility.Visible : Visibility.Collapsed;
}

我使用过这样的Style属性:

<StackPanel.Style>
     <Style TargetType="StackPanel">
          <Setter Property="Visibility" Value="Visible"/>   
          <Style.Triggers>
              <DataTrigger Binding="{Binding ElementName=treeDocs, Path=Items.Count}" Value="0">
                   <Setter Property="Visibility" Value="Hidden"/>
              </DataTrigger>
          </Style.Triggers>
     </Style>
</StackPanel.Style>
  • 但结果仍然相同

在设计模式下,一切都很完美!但事实上面板总是可见的。。。怎么了?

谢谢!

在TreeView上绑定';s项目

存储在Items中的实例永远不会更改(尽管它的集合内容会更改),因此绑定不会更新,绑定到Items.Count并相应地更改转换器,或者使用带有DataTriggerStyle,这将比转换器更合适。

类似这样的东西:

<StackPanel.Style>
    <Style TargetType="{x:Type StackPanel}">
        <Setter Property="Visibility" Value="Collapsed"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding Items.Count, ElementName=treeDocs}"
                         Value="0">
                <Setter Property="Visibility" Value="Visible"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</StackPanel.Style>

(由于依赖属性优先级,需要在setter中设置默认可见性)