Обновить наблюдаемую коллекцию путем запроса или добавления в коллекцию? - PullRequest
2 голосов
/ 17 июня 2010

У меня есть наблюдаемая коллекция, представленная как свойство в модели представления. Наблюдаемая коллекция загружается объектами из уровня доступа к данным (linq2sql).

Когда новый элемент добавляется в базу данных через другую модель представления, каков наилучший способ обновления наблюдаемой коллекции? Должен ли я снова заполнить наблюдаемую коллекцию запросом к базе данных или напрямую вставить новый объект в коллекцию?

Также я все еще пытаюсь выяснить, как заставить одну модель представления взаимодействовать с другой, но я использую mvvm только 3 дня.

Ответы [ 4 ]

3 голосов
/ 17 июня 2010

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

Пример:

class ViewModel1
{
    ObservableCollection<Object> entities;

    public ViewModel1()
    {
        EventsManager.ObjectAddedEvent += new EventHandler<ObjectAddedEventArgs>(EventsManager_ObjectAddedEvent);
        entities = new ObservableCollection<Object>();
    }

    void EventsManager_ObjectAddedEvent(object sender, ObjectAddedEventArgs e)
    {
        entities.Add(e.ObjectAdded);
    }
}

class EventsManager
{
    public static event EventHandler<ObjectAddedEventArgs> ObjectAddedEvent;

    public static void RaiseObjectAddedEvent(Object objectAdded)
    {
        EventHandler<ObjectAddedEventArgs> temp = ObjectAddedEvent;
        if (temp != null)
        {
            temp(null, new ObjectAddedEventArgs(objectAdded));
        }
    }
}

class ObjectAddedEventArgs : EventArgs
{
    public Object ObjectAdded { get; protected set; }

    public ObjectAddedEventArgs(Object objectAdded)
    {
        ObjectAdded = objectAdded;
    }
}

class ViewModel2
{
    public void AddObject(Object o)
    {
        EventsManager.RaiseObjectAddedEvent(o);
    }
}
2 голосов
/ 17 июня 2010

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

1 голос
/ 17 июня 2010

Что касается второй части (как научить модели представлений общаться друг с другом), я предпочитаю сохранять модели представлений максимально разделенными.Таким образом, Агрегирование событий или что-то вроде Message Broker кажется естественным выбором.

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

0 голосов
/ 17 июня 2010

Я использую созданные мной библиотеки, которые позволяют одному DataContext сохранять изменения обратно в родительский DataContext, а родительский DataContext уведомлять своих потомков о том, что он только что получил изменения.

С помощью этой функциональности я создаю один главный DataContext для всего моего приложения, затем для любых модальных окон с кнопками Ok и Cancel или других частей пользовательского интерфейса, которые временно нуждаются в собственном «представлении о реальности», я создаю дочерние DataContexts. Когда дочерний DataContext записывает обратно в родительский объект, это приводит к обновлению всех элементов управления, связанных с объектами в родительском объекте, и для родительского элемента передает изменения всем дочерним элементам, чтобы они тоже могли обновляться (или нет, если они находятся в режиме моментального снимка).

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

...