0

わかりました。これを説明するのは少し難しいので、WPFでMVVMモデルを使用してプログラムを作成しています。

メインのUserControlにグリッドがあり、コードを介して動的に子を更新する必要があります(更新することで、作成および破棄することを意味します)(データはViewModelによって変更されるため、グリッドの子を必要に応じて作成および破棄する必要があります) 。

XAMLのみを使用してUIElementsを動的に作成および破棄することはできないと確信しているので、ビューに更新関数があります(これらの更新関数は、UI自体を更新するだけで、ViewModelの何も変更しないため、MVVMを壊すことはありません。ビューは、ViewModelのデータに基づいてUIを変更するだけなので、大丈夫ですか?)

現在、ビュー内でViewModelのPropertyChangedイベントを割り当て、コードを介してそれをキャッチし、Updateイベントを発生させているため、Viewクラスのイベントは次のようになります。

        private void ViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "BoardWidth" || e.PropertyName == "BoardHeight")
                RecreateBoard();

            if (e.PropertyName == "Coordinates")
                UpdateCoordinates();

            if (e.PropertyName == "TilesOnly")
            {
                UpdateBoardBlocks();
                UpdateTiles();
            }

            if (e.PropertyName == "BoardBlockViewModels")
                UpdateBoardBlocks();

            if (e.PropertyName == "TileViewModels")
                UpdateTiles();

            if (e.PropertyName == "EntryPoint" | e.PropertyName == "CursorViewModel")
                UpdateEntryPoint();
        }

更新イベントは、ViewModelのデータに基づくコードを使用して、ビューのメイングリッド内に子を作成/破棄します。この現在の実装はうまく機能します。

ただし、XAMLを介してイベントハンドラーを実装したいと思います。したがって、私の質問は、上記のイベントハンドラーコードをXAMLに実装する方法です。データコンテキストプロパティが変更されたときに、ビュー内でメソッドを実行する方法が見つかりません。DataTriggersを調べましたが、メソッドを実行する機能が含まれていません。また、DataTriggerは、特定の値に設定されているときではなく、プロパティが変更されたときに起動する必要があります。

これは厳密にはビューモデル自体とは関係のないビューであるため、ビューモデルを介して更新をプッシュしたくありません。例えば。このような状況では、ビューの別の実装を更新する必要がない場合があります。ViewModelを介してそれをプッシュしたとしても、ビュー自体には、メソッドの実行方法に関して同じ問題があります。

ご協力ありがとうございました。

4

1 に答える 1

1

ビューにこれほど多くの命令型コードが必要な場合は、アプローチ方法が間違っている可能性があると思います。ほとんどの場合、データをリストやフィールドなどにバインドするだけです。要素を作成および削除する必要はほとんどありません。コントロールで要素を自動生成するか(たとえばItemsControls)、既存のインスタンスを再利用します。

このような動的な処理を行う必要がある場合は、そのロジックをカプセル化するUserControlsか、カスタムコントロールを使用して、バインドできるプロパティを提供するのが最適な場合があります(内部的には、依存関係プロパティの値変更イベントを処理して更新を行うことができます)。

ビューに残っているのは、これらのコントロールへのバインディングです。

于 2012-07-13T00:41:42.430 に答える