Prism コードサンプル学習:13-IActiveAwareCommands
はじめに
以下の記事の続きです。
https://qiita.com/mngreen/items/62280f71acf9eeb96fcd
13-IActiveAwareCommands
本サンプルは、前回の記事のCompositeCommandsのプログラムがベースとなっていますが、振る舞いが異なります。
上記の振る舞いの差がどこで生まれているかを以下で確認します。
-
1箇所目の差分は、CompositeCommandのコンストラクター引数にtrueが渡されていた点です。
- コンストラクターにtrueが渡されると_monitorCommandActivityフィールドに値が渡されます。(該当コード)
- _monitorCommandActivityフィールドに値が渡ると、ShouldExecuteメソッドで実行すべきか否かが判定されるようになります。
namespace UsingCompositeCommands.Core { public interface IApplicationCommands { CompositeCommand SaveCommand { get; } } public class ApplicationCommands : IApplicationCommands { private CompositeCommand _saveCommand = new CompositeCommand(true); public CompositeCommand SaveCommand { get { return _saveCommand; } } } }
-
2箇所目の差分は、TabViewModelクラスがIActiveAwareインターフェイスを実現していた点です。
- TabViewModel.IsActivateプロパティが変更されると、コマンドのIsActivateも同時に変わります。
- 過去記事で読み進めた通り、TabControlが切り替わるタイミングでTabViewModel.IsActiveプロパティが切り替わると思われます。
namespace ModuleA.ViewModels { public class TabViewModel : BindableBase, IActiveAware { // ... ここまで前回サンプルと同じコード ... bool _isActive; public bool IsActive { get { return _isActive; } set { _isActive = value; OnIsActiveChanged(); } } private void OnIsActiveChanged() { UpdateCommand.IsActive = IsActive; IsActiveChanged?.Invoke(this, new EventArgs()); } public event EventHandler IsActiveChanged; } }
-
TabControlが切り替わり、コマンドのIsActiveプロパティが表示されているもの以外はfalseになるので、結果として表示されているViewのコマンドのみが実行されています。
おわりに
今回はIActiveAwareCommandsと前回記事の差分を確認することで、利用方法を学びました。
このコマンドを利用すれば、表示されているビューのコマンドのみ実行させることができそうですね。
次回、14-UsingEventAggregatorについて見ていこうと思います。