Большие модельные коллекции в MVVM - PullRequest
2 голосов
/ 28 сентября 2010

Во время реализации моего первого приложения MVVM в WPF я размышлял о плюсах и минусах упаковки коллекций Model в связанные коллекции ViewModel для использования в View.

В нашей системе мы можем иметь несколько потенциально больших коллекций, например Строки заказа в заказе и позиции на складе, которые можно выбрать для строки заказа. В настоящее время они ищутся в SQL на уровне доступа к данным, а затем SqlDataReaders зацикливается, создавая коллекцию объектов модели.

После этого цикл вокруг коллекции объектов Model при создании коллекции объектов ViewModel представляется излишними издержками. Когда есть большие коллекции объектов Model, было бы лучше выставить их прямо в View?

Заранее спасибо за помощь, Марк


Редактировать Читая эту тему, я обнаружил эту статью MSDN , опубликованную в июле этого года (рецензируется Джошом Смитом не меньше), которая дает довольно сбалансированное представление о MVVM, а в разделе «Коллекции» сказано следующее:

Еще одна проблема с коллекциями определить, когда или если обернуть каждый Экземпляр модели в коллекции в экземпляре ViewModel. За меньшие коллекции, ViewModel может выставить новую наблюдаемую коллекцию и скопируйте все в базовый Коллекция моделей в ViewModel наблюдаемая коллекция, каждая упаковка Модельный элемент в коллекции в виде соответствующий экземпляр ViewModel как он идет. ViewModel может понадобиться слушать события, измененные коллекцией передать пользовательские изменения обратно в Базовая модель.

Однако для очень больших коллекций что будет выставлено в какой-то форме виртуализирующая панель, самая простая и самый прагматичный подход просто экспонировать объекты модели напрямую.

Большое спасибо за комментарии, попытка ограничить объем данных, передаваемых в ViewModel, или использование разбитых на страницы или других подходящих элементов управления уменьшит проблемы, я уверен, но мне интересно, будут ли еще ситуации было бы лучше просто связать коллекцию объектов Model внутри ViewModel?

1 Ответ

0 голосов
/ 28 сентября 2010

Полагаю, это будет зависеть от того, как вы хотите отображать данные. В конце концов ViewModel в первую очередь предназначен для обработки данных, которые требуются представлению.

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

Например, у вас может быть таблица данных для отображения позиций заказа для данного заказа.

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

public List<OrderItems> AllOrderItems
{
get{return this.DataAccessLayer.GetOrderItems().Where(x=>x.OrderNumber==this.OrderNumber).toList();
}

Здесь DataAccessLayer - это класс, который хранит данные базы данных кэша и взаимодействует с базой данных. Если хранится как единое целое, дублирование данных в нем будет уменьшено.

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

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