Это хороший способ реализовать приложение MVVM в WPF? - PullRequest
0 голосов
/ 01 июля 2011

Я довольно новичок в WPF. Я пытаюсь реализовать приложение чата с использованием Jabber.NET, и я хотел бы следовать правильной архитектуре MVVM. У меня есть следующие модели:

BuddyListModel

ChatSessionModel

ChatMessageModel

Следующие ViewModels:

BuddyListViewModel

ChatSessionsViewModel

ChatMessagesViewModel

Каждая виртуальная машина содержит ObservableCollection<> соответствующих моделей.

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

Другая проблема заключается в том, что я обрабатываю ВСЕ сообщения в одной ViewModel и думаю использовать фильтры (например, в linq) для отображения сообщений в соответствующем сеансе ChatSession. Это хорошо?

Ответы [ 2 ]

1 голос
/ 01 июля 2011

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

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

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

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

0 голосов
/ 02 июля 2011

Вы можете использовать Контроллеры вместе с шаблоном MVVM.Они являются посредниками между ViewModel и поэтому могут вызывать методы других ViewModels.

Примеры приложений WPF Application Framework (WAF) показывают, как можно использовать контроллерывместе с МВВМ.

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