Я конвертирую парсер чата для игры, которую я играю и которую я написал в c# winforms over to wpf, в основном для того, чтобы получить лучшую обработку MVVM и wpf. Вот список того, как я настроил свой проект
View: На данный момент это простой ListBox с ItemSource, привязанный к моей наблюдаемой коллекции Viewmodels
Model: У меня есть несколько символов, которые можно войти в систему одновременно, и каждый символ имеет класс чата. Класс чата запускает фонового работника, который хватает и следующую строку чата из игры и сбрасывает событие под названием IncomingChat с этой строки.
public event Action<Game.ChatLine> IncomingChat;
Я использую фонового работника для запуска события в моем фоновом работнике, потому что когда я использовал таймер, у меня постоянно возникали проблемы с потоком. Сначала я исправил это, изменив свой таймер на диспетчерский таймер, но мне показалось, что это неправильно, когда в моей модели есть диспетчерский таймер.
ViewModel: Так как у меня есть несколько символов, я создаю несколько моделей ChatViewModels. Я передаю символ в конструктор ChatViewModels и подписываюсь на событие Chat. Я создаю ObservableColleciton для удержания моих строк чата при получении этого события. Теперь я получаю поток сообщений на свой viewModel при попытке добавить строку, которую я получаю от события в чате, в мою ObservableColleciton.
Я обошел это, сделав так, чтобы обработчик входящего события чата моей ViewModel выглядел как
public ObservableCollection<Game.ChatLine) Chat {get; private set;}
void Chat_Incoming(Game.ChatLine line)
{
App.Current.Dispatcher.Invoke(new Action(delegate
{
Chat.Add(line)
}), null);
}
Это не кажется мне правильным. Хотя это работает, использование Диспетчера в моей вид-модели кажется мне неуместным.