MVVM CollectionViews в WPF Application Framework (WAF) - PullRequest
4 голосов
/ 13 января 2010

Короче говоря, мой вопрос: как вы предпочитаете выставлять отфильтрованные / отсортированные / сгруппированные 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 вполне приемлемо.

Есть комментарии?

1 Ответ

2 голосов
/ 23 февраля 2013

Я думаю, что реальное преимущество CollectionView заключается в том, что вам нужно сообщать информацию, когда вы просматриваете элементы collectionview один за другим. Таким образом, вы можете использовать свойство CurrentPosition и методы MoveCurrentToNext (/ etc.), Которые могут быть желательны. Мне особенно нравится возможность сообщать уведомления PropertyChanged в MVVM, когда свойства элементов в коллекции изменились / элементы были добавлены / удалены / изменены.

Я думаю, что имеет немного больше смысла использовать в элементах управления, которые требуют более сложных уведомлений (таких как сетка данных, где вы можете вызывать события PropertyChanged и сохранять в своем хранилище данных каждый раз, когда выбор или изменение нового элемента добавляются контроль).

Надеюсь, это имеет смысл. Это именно то, что я собираю как новичок.

Кроме того, я действительно не думаю, что что-то должно входить в выделенный код представления, кроме текста данных и общих данных, которые вы, возможно, передаете из модели представления.

...