読者です 読者をやめる 読者になる 読者になる

開発記その 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 です。上で示した、Parameter の引数をバインドで指定している部分ですが、たとえば List などで実装していると、引っ張ってこれません。どうやら、バインドでひっぱてこれるようにするには DependencyObjectCollection じゃないとだめらしいです。

データを表示し、場合によってはユーザーによるデータの変更を許可するターゲット UI プロパティ。ターゲットとしては、FrameworkElement の任意の DependencyProperty を使用できます。Silverlight 4 では、次の場合、ターゲットとして DependencyObject の DependencyProperty も使用できます。

・DependencyObject が FrameworkElement のプロパティの値である。
・DependencyObject が FrameworkElement のプロパティ (Resources プロパティなど) の値であるコレクション内に存在する。
・DependencyObject が DependencyObjectCollection(Of T) 内に存在する。

http://msdn.microsoft.com/ja-jp/library/cc278072(v=VS.95).aspx

もちろん ParameterBase クラスも DependencyObject を継承しています。

public abstract class ParameterBase : DependencyObject {

あと、指定された値を引数の型に変換する部分ですが、 nRoute から拝借しました。 XAML をゴリゴリ生成して、型変換を実行してます(w


※今回のチェックイン
http://moneybook.codeplex.com/SourceControl/changeset/changes/56064