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