WPF绑定没有重复

时间:2011-07-07 09:52:23

标签: c# wpf data-binding

我有一组看起来像这样的对象:

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”

5 个答案:

答案 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");
  }
}