我有一组看起来像这样的对象:
List<MyObject> objects = new List<MyObject>();
objects.Add(new MyObject("Stapler", "Office"));
objects.Add(new MyObject("Pen", "Office"));
objects.Add(new MyObject("Mouse", "Computer"));
objects.Add(new MyObject("Keyboard", "Computer"));
objects.Add(new MyObject("CPU", "Computer"));
class MyObject{
public string name;
public string category;
public MyObject(string n, string c){
name=n;
category=c;
}
}
我可以将该集合绑定到WPF中的List,并让它显示对象的类别(没有重复)吗? (可能还有该类别中对象的数量)
例如,我希望列表只显示两个项目,“Office”和“Computer”
答案 0 :(得分:1)
您可以使用LINQ执行此操作,例如:
public class AggregateCount
{
public string Name { get; private set; }
public int Count { get; private set; }
public AggregateCount(string name, int count)
{
this.Name = name;
this.Count = count;
}
}
var aggregateCounts = objects.GroupBy(o => o.category).Select(g => new AggregateCount(g.Key, g.Count()));
ObservableCollection<AggregateCount> categoryCounts = new ObservableCollection<AggregateCount>(aggregateCounts);
答案 1 :(得分:1)
CollectionViewSource
使用PropertyGroupDescription
。
在Resources
中,添加以下内容:
<Window.Resources>
<CollectionViewSource x:Key="MyCollectionViewSource" Source="{Binding Path=CollectionPropertyOnViewModel}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Category"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Window.Resources>
然后,对于ItemsControl
,请将ItemsSource
设置为{Binding Source={StaticResource MyCollectionViewSource}}
。
要设置标题模板的样式,请设置ItemsControl.GroupStyle
属性。同时为项目创建DataTemplate
。
阅读Bea Stollnitz here的优秀博客文章。
答案 2 :(得分:0)
你可以做任何你想做的事,那就是WPF的美丽。
进行查询以在 ModelView 图层中以格式恢复您想要的 并将结果绑定到查看。尝试在模型层上制作yuor programm中最复杂的东西,并将“虚拟”内容留给最终绑定,尽可能明显地,使Model和ModelView的内容更容易 debug 和/ em> 修复错误 future 。
希望这有帮助。
答案 3 :(得分:0)
我会使用Linq:
List<MyObject> distinctObj = (from o in objects select o).Distinct().ToList();
答案 4 :(得分:0)
如果您不想使用Linq:
private List<MyObject> objects = new List<MyObject>();
public ObservableCollection<String> Groups
{
get
{
ObservableCollection<String> temp = new ObservableCollection<String>();
foreach (MyObject mo in objects)
{
if (!temp.Contains(mo.category))
temp.Add(mo.category)
}
return temp;
}
set
{
objects = value;
RaisePropertyChanged("Groups");
}
}