Is it wrong to use the Dispatcher in my ViewModel?

Я конвертирую парсер чата для игры, которую я играю и которую я написал в 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);
}

Это не кажется мне правильным. Хотя это работает, использование Диспетчера в моей вид-модели кажется мне неуместным.

19
задан poco 19 September 2011 в 17:24
поделиться