2016-05-30 10 views
0

プリムのEventAggregatorを使用して複数のイベントを購読する出力ウィンドウを作成しました。これまでのところ、コンストラクタは二つの異なるイベントを処理している:C#デリゲートが2回呼び出されましたか?

public OutputWindowView(IEventAggregator eventAggregator) 
{ 
    eventAggregator.GetEvent<LoginStatusEvent>().Subscribe(trackLogin, true); 
    eventAggregator.GetEvent<ConsoleMessageEvent>().Subscribe(trackMessage, true); 

    this.InitializeComponent(); 
} 

両方のイベントがSetTextメソッドを介して同じ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

あなたはINotifyPropertyChangedイベントは自動的にUIスレッドにマーシャリングされているので、あなたのviewmodel上のプロパティにバインドすると設定が完了し、この

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

またはさらに簡単なようThreadOption.UIThreadを渡すことによって、UIスレッド上で購読することができます。

+0

ありがとうございます、あなたは財産への拘束についての2番目の点を拡大できますか?私はC#の初心者です。 – keeg

+0

通常、特にプリズムのコンテキストでは、データコンテキストとしてビューモデルを持つビューがあり、ビューモデルは(プリズムの 'BindableBase'から派生して)' INotifyPropertyChanged'を実装しており、ビューモデルのプロパティを変更できます任意のスレッドからビューが更新されます。ここでコメントするにはあまりにも、私は、wpfのデータバインディング、mvvmのための最高のグーグルは、プリズムの例のドキュメントを見て、概念を知ることができると思います。 – Haukinger

関連する問題