前提
WPF + Prism Template Packを使用したデスクトップアプリケーションを作成しています。
Module間の相互通信について正しい実装方法と考え方を教えてください。
構成
Shell内を3つのRegionに分割しています。
- Menu Region
メニューバーを表示するRegionです。
IsCheckableをTrueに設定したMenuItemが3つあります。
表示 -> ステータスバー
書式 -> 右端で折り返す
ウィンドウ -> 全画面表示
2. StatusBar Region
ステータスバーを表示するRegionです。
3. Content Region
テキストボックスが1つ配置されているRegionです。
実現したいこと
- メニューバー内の「ステータスバー」チェックボックスのIsCheckedとステータスバーのVisibilityが連動する。
- メニューバー内の「全画面表示」チェックボックスのIsCheckedとウィンドウのWindowStateが連動する。
- メニューバー内の「右端で折り返す」チェックボックスのIsCheckedとテキストボックスのTextWrappingが連動する。
実現する手段として検討したこと
各Module間の通信方法として、EventAggregatorを採用しています。
例として、MenuItemのIsCheckedにバインドしたViewModel内のVisibilityプロパティにEventAggregatorのPublishを記述した部分を抜粋します。
c#
1public class MenuViewModel 2{ 3 private IEventAggregator _eventAggregator; 4 private Visibility _visibility; 5 6 public Visibility Visibility 7 { 8 get { return _visibility; } 9 set 10 { 11 SetProperty(ref _visibility, value); 12 _eventAggregator.GetEvent<PubSubEvent<Visibility>>().Publish(_visibility); 13 } 14 } 15 16 public MenuViewModel(IEventAggregator eventAggregator) 17 { 18 _eventAggregator = eventAggregator; 19 } 20}
イベントの購読側では、発行されたイベントに対して自身のプロパティを更新する処理を記述しています。
c#
1public class StatusBarViewModel 2{ 3 private Visibility _visibility; 4 5 public Visibility Visibility 6 { 7 get { return _visibility; } 8 set { SetProperty(ref _visibility, value); } 9 } 10 11 public StatusBarViewModel(IEventAggregator eventAggregator) 12 { 13 eventAggregator.GetEvent<PubSubEvent<Visibility>>().Subscribe((v) => Visibility = v); 14 } 15}
分からないこと
- EventAggregatorを使用したModule間通信として、ViewModelのDelegateCommandでイベントを発行する方法も考えられると思います。
前述したプロパティのsetにてPublishする方法は正しい実装なのでしょうか?
- Menu Region側のプロパティに連動して異なるModuleのプロパティが変化することは実現できていますが、
MenuItemのIsCheckedは各Moduleの状態を表示する立場だと考えています。
前述した実装だと、まずMenuItemのIsCheckedの状態があって、その状態に各Moduleが連動しているような気がします。
下記のような流れが理想的に思いますが、そもそもこの思想が間違っていないか、どのように実現するのか、教えてください。
1 MenuItemをクリック
2 プロパティ変更イベント発行
3 StatusBarのVisibilityが変化
4 変化したことをMenuItem側にフィードバックしてMenuItemのIsCheckedが変化
補足情報(FW/ツールのバージョンなど)
Windows 10
Visual Studio 2019
Prism Template Pack 2.3.0
あなたの回答
tips
プレビュー