我有一个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是否已包含已分组的数据?
答案 0 :(得分:0)
我担心WPF中的System.Windows.Data.CollectionViewSource类没有IsSourceGrouped或等效属性,因此您无法真正告诉它数据已经分组。
你基本上有两个选择。
取消组合源集合并将CollectionViewSource的Source属性设置为未分组的集合,并照常将PropertyGroupDescription添加到其GroupDescriptions集合中:https://msdn.microsoft.com/en-us/library/ms742542(v=vs.110).aspx
将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;
}
<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>