2016-05-30 108 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