Фильтрация одной коллекции во множество списков - PullRequest
0 голосов
/ 03 октября 2011

У меня есть 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

Как это лучше сделать?

  • Создать 3 свойства в ViewModel с фильтрацией:

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

  • Некоторые возможности сделать это в XAML? Как?

  • Дополнительные параметры?

1 Ответ

1 голос
/ 03 октября 2011

В зависимости от того, как часто вы ожидаете изменения данных в списке, я бы, вероятно, выбрал 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

В качестве альтернативы, если данные в списке будут меняться очень редко, лучше выполнить фильтрацию с помощью LINQ.когда вы фактически заполняете список и фактически сохраняете 3 коллекции:

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, но вы не сможете отфильтровать их без некоторыхформа кода позади.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...