我有一个ListView控件绑定到ViewModel中的ListCollectionView
。
我想尝试对这些项目进行分组,但遇到一些问题。
我首先在VM中设置属性分组,然后添加GroupStyle
。
C#:
ListCollectionView.GroupDescriptions.Add(new PropertyGroupDescription("Category"));
XAML:
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListView.GroupStyle>
然而,列表现在只是类别名称,无法自己查看项目。
我并不完全理解这里发生了什么。当我为GroupStyle
创建一个模板时,我真的要绑定什么?除了Name
之外还有其他属性吗?
我刚刚将GroupStyle
添加到我已创建的ListView中,例如我包含ItemTemplate
。这是否与GroupStyle
混淆了什么?
如果列表中的Items属于另一个类,并且我不想根据它们所属的类的实例(它有一个ID)进行分组。然后我将组名作为此父类的属性。这可能吗?
部分解决方案:
问题在于ListView上应用的样式。我不知道风格如何干涉。
完整解决方案
我没有在列表框ItemsPresenter
中使用ControlTemplate
选择使用IsItemsHost
设置为true
的Panel。似乎ItemsPresenter必须用于GroupStyling才能正常工作。
答案 0 :(得分:16)
我认为错误在于您的代码中的其他位置。
通常,您在 ViewModel
上公开 Models 的集合namespace Derp
{
public sealed class ViewModel
{
public ObservableCollection<Model> Items {get;set;}
// initialization code not shown
}
public sealed class Model
{
public string GroupName {get;set;}
public string ModelName {get;set;}
}
}
在您的视图中,您将 CollectionViewSource 绑定到此集合:
<Window.DataContext>
<ViewModel xmlns="clr-namespace:Derp" />
</Window.DataContext>
<Window.Resources>
<CollectionViewSource
Source="{Binding Items}"
x:Key="GroupedItems">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription
PropertyName="GroupName" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Window.Resources>
接下来,我们将列表控件绑定到此 CollectionViewSource (在此示例中使用组合):
<ComboBox
ItemsSource="{Binding Source={StaticResource GroupedItems}}"
DisplayMemberPath="ModelName">
<ComboBox.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock
Text="{Binding Name}" />
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ComboBox.GroupStyle>
</ComboBox>
令人困惑的是,在 GroupStyle 中,您没有绑定模型,您绑定了模型<的集合/ em>分组(在本例中)属性“ GroupName ”。 CollectionViewSource 将模型分组到扩展CollectionViewGroup的集合中。这些组具有名为Name
的属性,该属性包含模型分组的公共值(GroupName
属性的值)。因此,在 HeaderTemplate 中,您绑定到 CollectionViewGroup.Name 。