WPF - 使用带有ALREADY分组数据的CollectionViewSource

时间:2016-12-12 07:55:26

标签: c# wpf wpf-controls collectionviewsource

我有一个ViewModel,在Windows 8,Android和iOS中用作Xamarin项目的一部分。我现在需要在WPF的ListView中显示该VM。

该VM将一些分组数据公开为ObservableCollection<GroupedResult<string, SearchResult>>。 GroupResult具有Key(String)属性和IEnumerable Source属性

使用Windows 8 ListView,我可以将该数据分配给CollectionViewSource(CVS),告诉CVS Items属性PropertyPath("Source")的路径,它可以正常工作。

然而,WPF似乎希望将一个未分组的List提供给它的CVS,以便它可以将它自己分组。如何告诉WPF CVS VM是否已包含已分组的数据?

1 个答案:

答案 0 :(得分:0)

我担心WPF中的System.Windows.Data.CollectionViewSource类没有IsSourceGrouped或等效属性,因此您无法真正告诉它数据已经分组。

你基本上有两个选择。

  1. 取消组合源集合并将CollectionViewSource的Source属性设置为未分组的集合,并照常将PropertyGroupDescription添加到其GroupDescriptions集合中:https://msdn.microsoft.com/en-us/library/ms742542(v=vs.110).aspx

  2. 将Source设置为分组集合,并为Grouping对象定义ItemTemplate:

    public MainWindow()
    {
        InitializeComponent();
        List<User> items = new List<User>();
        items.Add(new User() { Name = "John Doe", Age = 42, Sex = SexType.Male });
        items.Add(new User() { Name = "Jane Doe", Age = 39, Sex = SexType.Female });
        items.Add(new User() { Name = "Sammy Doe", Age = 13, Sex = SexType.Male });
    
        var result =
            from x in items
            group x by x.Sex into g
            orderby g.Key
            select g;
    
        listBox.ItemsSource = result;
    }
    
  3.    <ListBox x:Name="listBox">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Expander Header="{Binding Key}">
                        <ListBox ItemsSource="{Binding}">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <StackPanel>
                                        <TextBlock Text="{Binding Name}"/>
                                    </StackPanel>
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
                    </Expander>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>