C#委托调用两次?
问题描述:
我创建了一个输出窗口,其中多个事件使用Prism的EventAggregator
订阅。通过SetText
方法C#委托调用两次?
public OutputWindowView(IEventAggregator eventAggregator)
{
eventAggregator.GetEvent<LoginStatusEvent>().Subscribe(trackLogin, true);
eventAggregator.GetEvent<ConsoleMessageEvent>().Subscribe(trackMessage, true);
this.InitializeComponent();
}
这两起事件针对同一UI组件:到目前为止的构造是处理两个不同的事件
private void trackLogin(LoginStatus s)
{
SetText("Connected: " + s.IsConnected.ToString());
}
private void trackMessage(string s)
{
SetText(s);
}
我试图创建一个委托,以避免线程错误。
private delegate void SetOutputText(string content);
private void SetText(string content)
{
Trace.WriteLine("===== SetText =====");
var text = content + Environment.NewLine;
if (this.txtOutput.Dispatcher.CheckAccess() == false)
{
Trace.WriteLine("->CheckAccess > false");
SetOutputText _output = new SetOutputText(SetText);
this.Dispatcher.Invoke(_output, text);
}
else
{
Trace.WriteLine("->CheckAccess > true");
this.txtOutput.Text += text;
}
}
输出悬停是:
===== SetText =====
->CheckAccess > false
===== SetText =====
->CheckAccess > true
我希望可以将输出为:
===== SetText =====
->CheckAccess > false
OR
===== SetText =====
->CheckAccess > true
,但它似乎是两次打电话。
答
你可以通过ThreadOption.UIThread
这样
eventAggregator.GetEvent<ConsoleMessageEvent>().Subscribe(trackMessage, ThreadOption.UIThread, true);
或者更简单,绑定到属性上的视图模型在UI线程订阅就大功告成了,因为INotifyPropertyChanged
事件自动编组到UI线程。
谢谢你,你可以扩展你的第二点关于财产?我是C#的新手。 – keeg
通常,特别是在棱镜环境中,您将视图模型视为数据上下文,并且视图模型实现了'INotifyPropertyChanged'(通过从棱镜中的'BindableBase'派生),并且您可以更改视图模型上的属性从任何线程和视图将相应更新。对于这里的评论太多了,我想,最好的谷歌wpf数据绑定,mvvm,看看棱镜的例子文档,以了解这些概念。 – Haukinger