コンテキストプロパティを利用する
エクステンションのActivate
、Deactivate
メソッドのパラメータで渡されるIContext
オブジェクトのSetProperty
メソッド、GetProperty
メソッドを用いれば、エクステンション内を横断して状態を共有できます。
例えば次のようなユースケースに用います。
- エクステンション内で共通利用する設定情報を事前ロードしたい
- エクステンションの活性化時に共通の設定情報をコンテキストプロパティに設定しておきます
- コマンドやイベントの処理において、コンテキストプロパティから共通の設定情報を取得することができます
- エクステンションで拡張するリボンに配置したチェックボックスのチェック状態を操作したい
- マニフェストに記載するCheckBoxの
isChecked
プロパティで、バインドするコンテキストプロパティ名を指定できます - コマンドやイベント処理において、
GetProperty
メソッドに、バインドしたプロパティ名を指定することで、チェックボックスのチェック状態を取得することができます - コマンドやイベント処理において、
SetProperty
メソッドに、バインドしたプロパティ名を指定することで、チェックボックスのチェック状態を変更することができます
- マニフェストに記載するCheckBoxの
- モデルの変更イベント処理をNext Designの標準UI操作の場合とエクステンションのコマンド処理の場合に分岐したい
- エクステンションのコマンドにおいて処理中に有効なプロパティを設定しておきます
- モデルの変更イベントにおいて、プロパティ値を評価することで、コマンド処理の結果発生したイベントであるかを調べることができます
public class MyExtension : IExtension
{
public void Activate(IContext context)
{
context.SetProperty("Property1","value1");
}
public void SomeCommand(ICommandContext c, ICommandParams p)
{
// プロパティを取得します
var property1 = c.GetProperty("Property1") as String;
property1 = (property1 == null) ? "null" : property1;
// 結果を出力します
c.App.Output.WriteLine("sample", $"Property1 {property1}");
}
}
なお、ExtensionPointsライブラリを利用している場合は、エクステンション、コマンドハンドラ、イベントハンドラのクラスにContext.GetProperty<T>
メソッドがあり、よりシンプルにアクセスできます。
public class HelloCommand : CommandHandlerBase
{
protected override void OnExecute(ICommandContext c, ICommandParams p)
{
// string型でプロパティを取得します
var property1 = Context.GetProperty<string>("Property1");
UI.ShowMessageBox($"Hello world {property1}", ExtensionName);
}
}