Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF列表框中隐藏空组_C#_Wpf_Listbox - Fatal编程技术网

C# 在WPF列表框中隐藏空组

C# 在WPF列表框中隐藏空组,c#,wpf,listbox,C#,Wpf,Listbox,我试图进一步定制WPF ListBox的内置功能,以便在组中显示项目 简而言之,如果组中的所有项目都已折叠(Visibilityproperty),我希望隐藏组的容器(以及组的标题) 首先,我有一个非常简单的类City,表示单个项。此类包括显示的属性。在ItemContainerStyle内部,我只需要DataTrigger就可以将Visibility设置为Collapsed,如果该属性的值为False class City : INotifyPropertyChanged { priv

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

简而言之,如果组中的所有项目都已折叠(
Visibility
property),我希望隐藏组的容器(以及组的标题)

首先,我有一个非常简单的类City,表示单个项。此类包括显示的
属性。在
ItemContainerStyle
内部,我只需要
DataTrigger
就可以将
Visibility
设置为
Collapsed
,如果该属性的值为
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
m_cities=新列表
{
新城(){Name=“柏林”,Country=“德国”},
新城(){Name=“米兰”,Country=“意大利”},
新城(){Name=“法兰克福”,Country=“德国”},
新城(){Name=“罗马”,Country=“意大利”}
};
ICollectionView视图=CollectionViewSource.GetDefaultView(m_cities);
view.groupdescription.Add(新属性groupdescription(“国家”);
城市=视图;// 有点晚了,但希望它能在将来帮助其他人

在most(all?)
GroupItem
styles的控件模板中,有一个
ItemsPresenter
,用于承载和显示属于该组的子项。显然,如果所有子项都折叠,则此
ItemsPresenter
的高度将为零。

因此,您可以基于此条件向控件模板添加触发器,并相应地设置整个组项的
可见性。普通属性触发器似乎不起作用,但数据触发器会起作用。大概是这样的:

<ControlTemplate>
    <StackPanel x:Name="Root">
        ...
        <ItemsPresenter x:Name="ItemsPresenter" />
        ...
    </StackPanel>
    <ControlTemplate.Triggers>
        <DataTrigger Binding="{Binding ActualHeight, ElementName=ItemsPresenter}" Value="0">
            <Setter TargetName="Root" Property="Visibility" Value="Collapsed" />
        </DataTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

...
...
您需要命名控件模板的根元素(在本例中,它是一个
StackPanel
元素,我将其命名为“root”),还需要命名
ItemsPresenter
元素(我刚刚将其命名为“ItemsPresenter”)。显然,根元素可能是另一种类型,您可以使用任何您喜欢的名称

您的方法是正确的,但是需要绑定到
ItemsPresenter
实际高度,并且它需要是数据触发器而不是普通属性触发器

<ControlTemplate>
    <StackPanel x:Name="Root">
        ...
        <ItemsPresenter x:Name="ItemsPresenter" />
        ...
    </StackPanel>
    <ControlTemplate.Triggers>
        <DataTrigger Binding="{Binding ActualHeight, ElementName=ItemsPresenter}" Value="0">
            <Setter TargetName="Root" Property="Visibility" Value="Collapsed" />
        </DataTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>