2

だから..私はいくつかのコアクラスを持っています。いくつかのモジュールをロードしている間、EventAggregator.GetEvent().Publish() を使用してステータス ウィンドウに通知を送信しようとしています。ステータス ウィンドウの表示:

private Core()
        {
            SystemManager.EventAggregator.GetEvent<StartProgressWindow>().Publish(null);
            this.InitializeCore();
        } 

StartProgressWindow がステータス ウィンドウ イベントを開始し、InitializeCore メソッドがすべてのモジュールをロードしている場所です。

ステータス通知の送信:

Core.EventAggregator.GetEvent<ChangeProgressStatus>().Publish("Some module is loading");

サブスクライバー:

eventAggregator.GetEvent<ChangeProgressStatus>().Subscribe((message) =>
                {
                    this.Status = message;
                });

ステータス プロパティ:

public string Status 
        {
            get
            {
                return status;
            }
            set
            {
                this.status = value;
                RaisePropertyChanged("Status");
            }
        }

バインディング:

<Label Content="{Binding Status, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>

そして、実際には、問題:

プロパティは、送信先のすべてのステータスで変化します。でもUIには反映されず、フォーゼンです。ViewModel のクラスのコンストラクタで Status プロパティの値を「Some string」に設定したところ、もちろんうまく反映されます。私が間違っていることは何ですか?ありがとう、パベル!

4

2 に答える 2

0

UI スレッドでサブスクライブしていることを確認してみましたか?

eventAggregator.GetEvent<ChangeProgressStatus>().Subscribe((message) =>
                {
                    this.Status = message;
                }, ThreadOption.UIThread);
于 2012-07-03T10:50:57.927 に答える
0

すべてのイベントがメソッドと同時に処理されているためと思われるため、すべてのイベントとメソッドが終了InitializeCore()するまで実際には何もレンダリングされませんInitializeCore()

StartProgressWindowより低いDispatcherPriorityRenderでイベントを起動してみてください。DispatcherPriority.Background

private Core()
{
    this.Dispatcher.BeginInvoke(DispatcherPriority.Background,
        new Action(delegate 
        { 
            SystemManager.EventAggregator.GetEvent<StartProgressWindow>().Publish(null);
        }));

    this.InitializeCore();
} 
于 2012-07-03T12:39:45.380 に答える