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