【发布时间】:2011-11-20 09:34:30
【问题描述】:
我正在将我在 c# winforms 中编写的游戏的聊天解析器转换为 wpf,主要是为了更好地处理 MVVM 和 wpf。这是我如何设置项目的简要说明
查看: 现在它只是一个简单的 ListBox,其中 ItemSource 绑定到我的 viewmodels 可观察聊天集合
型号: 我有多个角色可以一次登录,每个角色都有一个聊天类。聊天类启动一个后台工作者,从游戏中抓取下一行聊天,并使用该行触发一个名为 IncomingChat 的事件。
public event Action<Game.ChatLine> IncomingChat;
我正在使用后台工作者在我的 backgroundworkers progresschaged 事件中触发一个事件,因为当我使用计时器时,我一直遇到线程问题。起初我通过将 Timer 更改为 DispatchTimer 来纠正此问题,但在我的模型中使用 DispatchTimer 对我来说似乎不合适。
视图模型: 由于我有多个角色,我正在创建多个 ChatViewModel。我将一个字符传递给 ChatViewModels 构造函数并订阅 Chat 事件。当收到此事件时,我创建了一个 ObservableColleciton 来保存我的聊天行。现在,当我尝试将我从聊天事件收到的行添加到我的 observablecollection 时,我的 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);
}
但我觉得这不对。虽然它有效,但在我的视图模型中使用 Dispatcher 对我来说似乎不合适。
【问题讨论】:
标签: c# wpf mvvm observablecollection