Короче говоря, мой вопрос: как вы предпочитаете выставлять отфильтрованные / отсортированные / сгруппированные ObservableCollections для представлений в WAF?
Я был довольно доволен своей первой попыткой, которая включала фильтрацию на ВМ и предоставление ICollectionView объектов Model для привязки View к:
public StartDetailViewModel(IStartDetailView view, StartPoint start, Scenario scenario)
: base(view)
{
this.scenario = scenario;
this.start = start;
this.startsViewSource = new CollectionViewSource();
this.startsViewSource.Filter += new FilterEventHandler(Starts_Filter);
this.startsViewSource.Source = scenario.Starts;
}
public ICollectionView FilteredStarts
{
get
{
return startsViewSource.View;
}
}
void Starts_Filter(object sender, FilterEventArgs e)
{
if (e.Item != null)
{
e.Accepted = (((StartPoint)e.Item).Date == this.start);
}
}
}
Однако непосредственного экспонирования объектов Model недостаточно, поскольку для каждого элемента теперь требуется своя ViewModel.
Итак, CollectionViewSource.Source теперь присоединен к коллекции Views. Основная проблема с этим при применении фильтров:
void Starts_Filter(object sender, FilterEventArgs e)
{
//Since e.Item is now a view we are forced to ask the View for the ViewModel:
StartItemViewModel vm = ((IStartItemView)e.Item).GetViewModel<StartItemViewModel>();
[...]
}
Мне кажется, это неправильно. Есть ли лучшие подходы?
UPDATE
Таким образом, я вернулся к CollectionViewSource.Source объектов Model и сохранил отдельную коллекцию дочерних объектов View, к которым привязан View.
Тогда возникает вопрос: почему я вообще использую CollectionViewSource в ViewModel?
Я думаю, что применяется следующий принцип: Если функциональность фильтрации / сортировки является свойством только представления (т. Е. Альтернативное представление может на законных основаниях не предоставлять такую функциональность), то в представлении должны использоваться CollectionViews (с выделенным кодом при необходимости ). Если функция фильтрации / сортировки является измерением модели, то это может быть решено в ViewModel или Model другими способами.
Это имеет смысл, как только вы поймете, что выделение кода в представлениях MVVM вполне приемлемо.
Есть комментарии?