2

Closed

EnabledInvokeCommandActionの機能追加をコミットしました。

description

■対象
Okazuki.MVVM.PrismSupport.Interactivity.EnabledInvokeCommandAction
 
■内容
CommandParameterにValueConverterを指定することでTriggerから受け取るパラメータを利用できるようにしました。
 
■詳細
CommandParameterプロパティにSystem.Windows.Data.IValueConverter型がセットされた場合は Triggerから受け取るパラメータをそのValueConverterで変換してCommandに渡します。
それ以外はCommandParameterプロパティそのままの値をCommandに渡します。
サンプルはInvokeCommandActionWithEventArgs.csprojです。
 
追加の動機は「コントロールのEventArgsを何かしらの形でCommandのパラメータに入れたい」というものでした。
コントロールのEventArgsを強く意識していますが、実装自体はIValueConverterの実装クラスをセットさせるだけなので
汎用的にTriggerから受け取るパラメータに対応できると思います。
 
EventArgs用の専用のプロパティを作ろうかとも考えましたが、結局Triggerから受け取るパラメータを変換させるだけなので
この実装(ComanndParameterにIValueConverterを指定させる)の方がシンプルかな、と思いました。
 
■懸念点、課題
EnabledInvokeCommandActionは、その名の通りAssociatedObjectのIsEnabledを制御しますが、
その機能は今回実装した機能と背反してしまいます。
 
今回の機能でのCommand.CanExecuteはTrigger発生時以外は意味が無いですし、
IsEnabledがFalse状態ならそもそもイベントが発生しない・・・ということも考えられます。
 
結局、
CommandParameterにValueConverterを指定した場合はAssociatedObjectのIsEnabled制御は行わない
という実装にしましたが、結果、「EnabledInvokeCommandAction」という名前と少し離れた実装になってしまった感じがあります。
 
対策案としては
1.EnabledInvokeCommandActionを、「多機能のInvokeCommandAction」という意味を表す名前にする
2.EnabledInvokeCommandActionとは別に、今回の機能のみを実装したInvokeCommandActionを作成し、「WithTriggerEventArgsInvokeCommandAction」等の名前をつける。
 
等が考えられるかな、、と思います。

最初2でいこうかと思ったのですが、似たような機能のクラスが複数あるのは使う側が混乱するかなと思い、今回の実装としました。

 
ご意見を頂けたらうれしいです。
 
以上、よろしくお願い致します。
Closed Oct 31, 2011 at 12:40 PM by okazuki

comments

okazuki wrote Jun 20, 2011 at 1:26 AM

EnabledInvokeCommandActionという名前が、実態とそぐわなくなったので何かいい名前にしましょう。
いい名前は・・・何がありますかね^^;

abcnokaigande wrote Jun 20, 2011 at 1:31 AM

・InvokeCommandActionEx
・ExtendedInvokeCommandAction

今のところこれくらいしか思いつかないです・・・;;スミマセン

wrote Jun 20, 2011 at 1:46 AM

abcnokaigande wrote Jun 20, 2011 at 2:10 AM

okazukiさんと協議の結果、
ExtendedInvokeCommandAction
とします。

今後機能がふくらんできたら、ばらすことを考えます。

abcnokaigande wrote Jun 20, 2011 at 2:19 AM

クラス名変更をコミットしました。

wrote Oct 31, 2011 at 12:40 PM

wrote Feb 13, 2013 at 5:54 PM

wrote May 15, 2013 at 4:41 AM