Я конвертирую чат-парсер для игры, в которую играю, я написал в С# winforms для wpf, главным образом, чтобы получить лучший дескриптор MVVM и wpf. Ниже приведен пример того, как настроен мой проект
Вид: На данный момент это просто простой ListBox с ItemSource, связанный с моей наблюдаемой коллекцией наблюдаемых чатов
Model: У меня есть несколько символов, которые могут быть зарегистрированы в одно время, и каждый символ имеет класс чата. В чат-классе начинается фоновый рабочий, который захватывает и следующую строку чата из игры и запускает событие под названием IncomingChat с этой строкой.
public event Action<Game.ChatLine> IncomingChat;
Я использую фона рабочего для того, чтобы запустить событие в моем workworked workworked, потому что, когда я использовал таймер, я продолжал получать проблему с потоками. Сначала я исправил это, изменив мой Timer на DispatchTimer, но мне не показалось, что у меня есть DispatchTimer в моей модели.
ViewModel: Поскольку у меня есть несколько символов, я создаю несколько ChatViewModels. Я передаю персонажа в конструктор ChatViewModels и подписываюсь на событие чата. Я создаю ObservableColleciton, чтобы держать мои строки чата, когда это событие получено. Теперь я получаю проблему с потоками на моей модели viewModel при попытке добавить строку, которую я получаю из своего события чата, в мою наблюдаемую коллекцию.
Я обошел это, сделав так, чтобы мой обработчик событий viewmodels выглядел так:
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);
}
Это мне не нравится. Хотя это работает, использование Диспетчера в моей модели просмотра, как это кажется мне неуместным.