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について見ていこうと思います。