MVVM какая часть шаблона отвечает за группировку данных

Я возился с паттерном MVVM и сейчас пытаюсь реализовать небольшое приложение на его основе.

Это приложение имеет сетку данных, в которой, как ни странно, представлены некоторые данные. Теперь я пытаюсь добавить некоторые способности группирования к нему. Я знаю, как написать это в коде (C# и XAML), но мне интересно, в какой слой я должен поместить ответственный код.

Одна часть меня говорит мне, что это должно быть в представлении, потому что это код специально для этого конкретного представления. Он не является общим и служит одной цели: группировать данные.

С другой стороны, я думаю, что должен справиться с этим во ViewModel с помощью команды. Однако кажется, что я загрязняю свою ViewModel с помощью определенной логики View.

Любой лиг, который можно пролить на это?

3 ответа

Решение

В большинстве моих приложений MVVM я пытаюсь разделить обязанности следующим образом:

  • Представление должно просто выполнить простой перевод данных модели представления в пиксели. Обычно это приводит в основном к XAML и очень небольшому коду.
  • Модель представления должна выполнять специфичную для представления логику, такую ​​как группировка и т. Д. У меня часто даже есть несколько моделей представления для каждого представления. Вы можете иметь основную модель представления, которая предоставляет вашему представлению список подмоделей модели на группу, например, для реализации группировки.
  • Если у вас есть какая-либо логика, которая применима к более чем одной модели представления, это, вероятно, логика домена и должна перейти в модель домена.

Поэтому я думаю, что группировка должна идти в viewmodel.

Если пользователь имеет какое-то влияние на группировку, я бы связал его с ICollectionView, предоставляемым ViewModel. Представление поддерживает группировку, фильтрацию, сортировку и валюту, а интерфейс ICollectionView создан из System.ComponentModel, поэтому вам не нужно добавлять ссылку "gui" в ваш проект ViewModel. Также WPF DataGrid поддерживает интерфейс ICollectionView.

Если пользователь не влияет на группировку (группы фиксированы), я просто "предварительно" сгруппирую данные в модели. НТН.

Там нет ни одного ответа на это. Это действительно зависит от вашего сценария:

1) Влияет ли пользователь на этот вопрос? Если нет, и это фиксированная группировка, я опубликую свойство с помощью IGrouping и использую dataservice или LINQ, чтобы сделать это, прежде чем оно войдет в представление.

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

Другие вопросы по тегам