TreeViewItem中的HasItems属性为true,即使所有子项都是Visibility = Collapsed

时间:2014-11-14 08:57:21

标签: c# xaml

请你给我一个提示,让HasItems Property变得更好。 我有一个像这样的TreeView:

    <TreeView ItemsSource="{Binding Customers}">
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding HasItems, RelativeSource={RelativeSource Self}}" Value="True">
                        <Setter Property="Foreground" Value="Red" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding HasItems, RelativeSource={RelativeSource Self}}" Value="False">
                        <Setter Property="Foreground" Value="Blue" />
                    </DataTrigger>
                </Style.Triggers>
                <Setter Property="AutomationProperties.AutomationId" Value="{Binding AutomationId}" />
                <Setter Property="IsExpanded" Value="True" />
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
            </Style>
        </TreeView.ItemContainerStyle>
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Customers}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Name}" />
                    <TextBlock Text="{Binding FamilyName}" Margin="5,0,0,0" />
                </StackPanel>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

代码背后:

    public ObservableCollection<Customer> Customers { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
        Customers = new ObservableCollection<Customer>();

        var homer = new Customer("Homer", "Simpson");
        homer.Customers.Add(new Customer("Bart", "Simpson"));
        homer.Customers.Add(new Customer("Lisa", "Simpson"));
        homer.Customers.Add(new Customer("Maggie", "Simpson"));
        var chief = new Customer("Chief", "Wiggum");
        chief.Customers.Add(new Customer("Ralf", "Wiggum"));
        Customers.Add(homer);
        Customers.Add(chief);

    }

Class Customer实现了INotifyPropertyChanged,一切都很好。 正如你在这里看到的,我有一个DataTrigger来改变颜色,取决于&#34; HasItems&#34; TreeViewItem的属性。 问题是:HasItems为true,即使所有子项都被隐藏或折叠。

见这里:我做了'Wiggum&#34;的主席的可见性。崩溃了。并且&#34; Chief Wiggum&#34; -TreeViewItem仍然是红色。

With Ralfs TreeViewItem Collapsed

1 个答案:

答案 0 :(得分:2)

嗯,正如你可以想象的那样,项目被隐藏的事实并不意味着树视图没有项目。

一种可能的方法是以下列方式更改DataTrigger:

<DataTrigger Binding="{Binding Items, Converter={StaticResource HasVisibleItemsConverter}, RelativeSource={RelativeSource Self}}" Value="True">

创建一个实现IValueConverter HasVisibleItemsConverter 转换器类,在那里你应该检查是否有任何可见的项目 - 我会留给你自己的练习。

然后在Resources区域(Window.Resources或UserControl.Resources)中创建 HasVisibleItemsConverter 的实例:

<Window.Resources>
    <conv:HasVisibleItemsConverter x:Key="HasVisibleItemsConverter" />
</Window.Resources>

并且不要忘记在Window / UserControl的命名空间定义中添加conv="...",指向转换器所在的程序集和命名空间。