開発記その 11 - InvokeMethodAction に引数 -
さて、開発記その1 で書いていた思うところあって作った InvokeMethodAction ですが、その思うところをようやっと実装しました。まぁ、実装自体は結構前にやっていて、ブログに書いてなかったのですが・・・。
で、思うところってなんやったのって話ですが、 InvokeMethodAction で実行されるメソッドに引数を渡したかったのです。たとえば、検索ボックスが一つだけの画面で、検索内容をバリデーションしなくっても OK な場合とかは、わざわざ VM にプロパティ作るのがめんどいですよね。引数に渡ってきてくれればうれしいわけで。っていうのを作りました。
書くコードは以下のような感じ。
<localInteractivity:InvokeMethodAction TargetObject="{Binding DataContext, ElementName=Self}" MethodName="Search"> <localInteractivity:Parameter Value="{Binding Path=Text, ElementName=SearchTextBox}" /> </localInteractivity:InvokeMethodAction>
public void Search(string searchPattern) { //.... }
Parameter を複数並べたら上から順番に引数に渡されます。楽ちんですね。
実装は InvokeMethodAction に ParameterCollection ってプロパティを追加してます。で、この ParameterCollection は DependencyObjectCollection
//InvokeMethodAction... public class InvokeMethodAction : intera.TargetedTriggerAction<object>, INotifyActionCompleted { public InvokeMethodAction() { this.Parameters = new ParameterCollection(); } public ParameterCollection Parameters {get; private set;} //ParameterCollection public class ParameterCollection : DependencyObjectCollection<ParameterBase> {
で、ポイントはこの DependencyObjectCollection
データを表示し、場合によってはユーザーによるデータの変更を許可するターゲット UI プロパティ。ターゲットとしては、FrameworkElement の任意の DependencyProperty を使用できます。Silverlight 4 では、次の場合、ターゲットとして DependencyObject の DependencyProperty も使用できます。
・DependencyObject が FrameworkElement のプロパティの値である。
http://msdn.microsoft.com/ja-jp/library/cc278072(v=VS.95).aspx
・DependencyObject が FrameworkElement のプロパティ (Resources プロパティなど) の値であるコレクション内に存在する。
・DependencyObject が DependencyObjectCollection(Of T) 内に存在する。
もちろん ParameterBase クラスも DependencyObject を継承しています。
public abstract class ParameterBase : DependencyObject {
あと、指定された値を引数の型に変換する部分ですが、 nRoute から拝借しました。 XAML をゴリゴリ生成して、型変換を実行してます(w
※今回のチェックイン
http://moneybook.codeplex.com/SourceControl/changeset/changes/56064