1

私は、自分が作成するアプリケーションをよりシンプルにするように努力しており、そのためにいくつかの手順を実行しましたが、私に固有のものとはまったく思えない興味深い問題が残っています。私は何が間違っているのだろうかと思っています。

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

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

これは、実際には必要以上に複雑に思えます。私はすでに行ったことをすべて捨てても構わないと思っています。神聖な牛はありません。1 年後に振り返って自分が何をしていたかを簡単に把握できる、より単純な方法でこれを行いたいだけです。

4

2 に答える 2

0
{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},
    Path=DataContext.MyCommand}
于 2012-03-29T15:29:45.747 に答える
0

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

おそらく次のようなものです:

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を参照)。

于 2012-03-29T15:39:38.620 に答える