在WPF ListBox中隐藏空组

问题描述 投票:2回答:1

我试图进一步定制WPF ListBox的内置功能,以显示组中的项目。

简而言之,我想隐藏组的容器(和组的标题),如果组内的所有项目都是折叠的(Visibility 属性)。)

首先,我有一个非常简单的类City,代表单个Item。这个类包括 Shown 财产。内 ItemContainerStyle 我只是有 DataTrigger 该套 VisibilityCollapsed 如果这个属性的值是 False.

class City : INotifyPropertyChanged
{
    private bool m_Shown = true;

    public string Name { get; set; }
    public string Country { get; set; }

    public bool Shown
    {
        get
        {
            return m_Shown;
        }
        set
        {
            m_Shown = value;
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Shown"));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

我就是这样添加样板城市,添加群组描述,都能正常工作。

m_cities = new List<City>
{
    new City() { Name = "Berlin", Country = "Germany" },
    new City() { Name = "Milano", Country = "Italy" },
    new City() { Name = "Frankfurt", Country = "Germany" },
    new City() { Name = "Rome", Country = "Italy" }
};

ICollectionView view = CollectionViewSource.GetDefaultView(m_cities);
view.GroupDescriptions.Add(new PropertyGroupDescription("Country"));
Cities = view; // <-- Binds to ItemsSource of ListBox

我尝试了几种方法来自动隐藏组,如果没有更多的项目可见(所有的项目都是折叠的),但都不成功。

一种方法是重复上面的代码中的最后3行,这样做是可行的,但我注意到这种方法的速度很慢,而listbox必须为用户快速工作。

Bellow是我的一个例子,这个方法实际上对隐藏是有效的,但是在这之后我就不能再把组显示出来了。我试过用转换器和类似的方法,但我不能让组显示出来。重见天日.

<ListBox.GroupStyle>
    <GroupStyle>
        <GroupStyle.ContainerStyle>
            <Style TargetType="{x:Type GroupItem}">
                <Style.Triggers>
                    <Trigger Property="ActualHeight" Value="20">
                        <Setter Property="Visibility" Value="Collapsed"/>
                    </Trigger>
                </Style.Triggers>
                <Setter Property="Visibility" Value="Visible"/>
                <Setter Property="MinHeight" Value="20"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type GroupItem}">
                            <StackPanel>
                                <TextBlock Text="{Binding Path=Name}"/>
                                <ItemsPresenter/>
                            </StackPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </GroupStyle.ContainerStyle>
    </GroupStyle>
</ListBox.GroupStyle>

谢谢你的帮助。

c# wpf listbox
1个回答
1
投票

有点(!)晚了,但希望将来能帮到别人。

GroupItem 风格有 ItemsPresenter 中的子项目,用于托管和显示属于该组的子项目。因此,我们有理由认为: 如果所有的子项目都是折叠的,这个 ItemsPresenter 的高度将为零。

因此,你可以根据这个条件在模板中添加一个触发器,并在模板中设置了 Visibility 的整个组项。普通的属性触发似乎不起作用,但数据触发可以。在组项的控制模板中加入类似这样的东西。

<ControlTemplate.Triggers>
    <DataTrigger Binding="{Binding ActualHeight, ElementName=ItemsPresenter}" Value="0">
        <Setter Property="Visibility" Value="Collapsed" />
    </DataTrigger>
</ControlTemplate.Triggers>

你需要把它命名为 ItemsPresenter 控件模板中。这里我只是把它叫做 "ItemsPresenter",但你可以把它叫做任何你想要的名字。

<ItemsPresenter x:Name="ItemsPresenter" />

很明显,你的思路是正确的,但是你需要绑定到 "ItemsPresenter "上。ActualHeightItemsPresenter而且它需要是一个数据触发器,而不是一个普通的属性触发器。

© www.soinside.com 2019 - 2024. All rights reserved.