将一个集合过滤到多个列表框

时间:2011-10-03 12:28:54

标签: wpf mvvm filter

我有ViewModel

public class VM
{
    public ObservableCollction<PersonRole> PersonRoles { get; private set; }
}

public class PersonRole
{
    public int RoleID { get; set; }
    //..
}

View中,我必须显示三个ListBoxes

  • RoleID == 1
  • 的所有人
  • RoleID == 2
  • 的所有人
  • RoleID == 3
  • 的所有人

如何做得更好?

  • 使用过滤在ViewModel中创建3个属性:

    Roles1 = CollectionViewSource.GetDefaultView(PersonRoles);
    Roles1.Filter = o => ((PersonRole)o).RoleID == 1;

  • XAML中执行此操作的一些可能性?怎么样?

  • 更多选项?

1 个答案:

答案 0 :(得分:1)

根据您对列表中数据的预期更改频率,我可能会按照您的建议选择ICollectionView个实例。但是,您将无法将CollectionViewSource.GetDefaultView用于3个单独的属性,因为它每次都会返回相同的对象实例。相反,您需要明确创建新的ICollectionView s:

this.Property1 = new ListCollectionView(this.PersonRoles);
this.Property2 = new ListCollectionView(this.PersonRoles);
this.Property3 = new ListCollectionView(this.PersonRoles);
// then set up filters

或者,如果列表中的数据只是很少变化,那么当您实际填充列表并实际存储3个集合时,最好使用LINQ进行过滤:

this.Property1 = new ObservableCollection<PersonRole>(dataSource.Where(o => o.RoleID=1);
this.Property2 = new ObservableCollection<PersonRole>(dataSource.Where(o => o.RoleID=2);
//etc

如果您希望以任何规律性添加和删除整个列表中的项目,这种方法并不是特别好,因为这意味着您需要手动保持所有3个列表始终同步。

作为最终评论,您可以在XAML中设置集合视图,但如果没有某种形式的代码,您将无法对其进行过滤。