2016-05-30 135 views
0

我创建了一个输出窗口,其中多个事件使用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 

,但它似乎是两次打电话。

回答

1

你可以通过ThreadOption.UIThread这样

eventAggregator.GetEvent<ConsoleMessageEvent>().Subscribe(trackMessage, ThreadOption.UIThread, true); 

或者更简单,绑定到属性上的视图模型在UI线程订阅就大功告成了,因为INotifyPropertyChanged事件自动编组到UI线程。

+0

谢谢你,你可以扩展你的第二点关于财产?我是C#的新手。 – keeg

+0

通常,特别是在棱镜环境中,您将视图模型视为数据上下文,并且视图模型实现了'INotifyPropertyChanged'(通过从棱镜中的'BindableBase'派生),并且您可以更改视图模型上的属性从任何线程和视图将相应更新。对于这里的评论太多了,我想,最好的谷歌wpf数据绑定,mvvm,看看棱镜的例子文档,以了解这些概念。 – Haukinger