2012-03-29 11 views
1

私は自分のアプリケーションをよりシンプルにするために自分自身を押し進めています。それを実行するためのいくつかの手順を実行しましたが、私はまったく興味深い問題が残っていますそれが私にとってユニークであるように感じる。私は何が間違っているのだろうかと思っています。MVVMのアプローチでICommand/RelayCommandを簡略化

モデルオブジェクトのコレクションを保持するViewModelがあります。ビューは、コレクション内のすべてのオブジェクトを表示するListViewです。モデルオブジェクトには、それらを操作するためのすべてのロジックがあります。各項目のListViewの行の中にはボタンがあり、モデルオブジェクトのメソッドを呼び出すにはそのボタンを配線する必要があります。

これを動作させるには、コマンド・バインディングを追加する必要がありますが、モデル・オブジェクトのパラメータをViewModel内部で使用できるように、親ウィンドウ・データ・コンテキストにはすべてそのモデル・オブジェクトのパラメータを渡します。親ウィンドウのデータコンテキスト)を呼び出して、渡されているモデルオブジェクトのメソッドを呼び出します。

これは本当に必要以上に複雑なようです。私はすでにやったことを捨ててもいいし、神聖な牛はいません。今年は一年で振り返り、自分が何をやっていたかを簡単に知ることができます。

+0

親ウィンドウとDataContext.MyCommandプロパティを指定するRelativeSourceを使用してBindingを使用できます。 – Jeff

+0

モデルのビューのボタンによって直接呼び出されるコマンドバインディングをモデルが作成しないのはなぜですか? – Phil

+0

私はそれについても考えましたが、私のモデルにビジネスロジックを埋め込み、System.Windowsの.NETライブラリの一部(DependencyObject - 私はバインドできるようになりました)とSystem.Windows.Input (ICommand/RoutedCommand)はモデルオブジェクトを持つのが間違っているようです。 – Andrew

答えて

0
{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, 
    Path=DataContext.MyCommand} 
+0

それは私がちょうどそれを実装しなければならなかったのですが、私の質問はこれを行う方法ではありません。 – Andrew

+0

上記のバインディングの表現を簡略化するためのマークアップ拡張を書くことができます。 – Jeff

+0

これを試していますが、マークアップ拡張機能でオブジェクトに直接アクセスできるようにするのが理想です。 'Command = {app:CustomExtension Object = CurrentObject、MethodName = MethodName} ' 私はそれを動作させるのに苦労しています。 – Andrew

0

モデルオブジェクトのViewModelにプレゼンタークラスを作成し、それらのコレクションを作成します。それらの代わりにICommandプロパティを置き、親datacontextで呼び出すメソッドへの参照を渡すことができます。おそらく、

次のようなもの:

public class ModelPresenter : INotifyPropertyChanged 
{ 
    private Model _model; 

    public ModelPresenter(Model model, Action<Model> parentAction) 
    { 
     _model = model 
     _action = parentAction; 
    } 

    public ICommand MyAction 
    { 
     get { return new RelayCommand(() => _parentAction(_model)); } 
    } 

    ... 
} 

あなたのモデルビューのプロパティに結合されることがありますようにまた鳴ります。モデルでINotifyPropertyChanged(http://support.microsoft.com/kb/938416/en-usを参照)が実装されていない場合、メモリリークが発生する可能性があるため、これを行うべきではありません。

+0

私はモデルに直接バインディングしていますが、これを実現するためにすべてのモデル要素にINotifyPropertyChangedを適用することを選択しました。 – Andrew