7

我有一个 ListView 控件绑定到ListCollectionViewViewModel 中的一个。

我想尝试对这些项目进行分组,但遇到了一些问题。

我将 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吗?

如果列表中的项目属于另一个类,我不想根据它们所属的类的实例进行分组(它有一个 ID)。然后,我会将组名作为该父类的属性。那可能吗?

部分解决方案:

问题出在 ListView 上应用的样式。我不知道这种风格是什么意思。

完整解决方案

我没有ItemsPresenter在我的列表框中ControlTemplate使用 a 选择使用IsItemsHost设置为的面板true。似乎必须使用 ItemsPresenter 才能使 GroupStyling 正常工作。

4

1 回答 1

16

我认为错误在您的代码中的其他地方。

通常,您在ViewModel上公开一组模型

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中,您没有绑定Model,而是绑定了一组Models ,该集合在(在这种情况下)属性“ GroupName ”上分组。CollectionViewSource将您的模型分组到扩展CollectionViewGroup的集合中。这些组有一个名为 的属性Name,其中包含模型分组的共同值(GroupName属性的值)。因此,在HeaderTemplate中,您将绑定到CollectionViewGroup.Name

于 2011-05-24T13:36:47.127 回答