1

WPF アプリケーションで MVVM パターンを使用しています。パフォーマンスを向上させるために、ウィンドウをキャッシュしようとしています。そのために、私はそれらを決して閉じず、閉じる代わりに非表示にします。非表示のウィンドウはすべて辞書に保存されるので、再利用できます。ウィンドウが再び開いたら、新しいビュー モデルを作成し、それをキャッシュ ビューに関連付けます。

ただし、非表示のウィンドウが ViewModels のコマンドの CanExecute メソッドを呼び出し続けるため、問題があります。これにより、ユーザーが多数のウィンドウを開いたり閉じたりすると、パフォーマンスの問題が発生します。

Window.DataContextプロパティを nullに設定したりClearValue(DataContextProperty)、目標を達成したりすると、問題が発生します。双方向バインディングがある場合、それらはすべて、データ コンテキストからのバインド解除中に発生します。そのため、ビュー モデルの一部の値が null になります。ビューを非表示にした後にビューモデルからプロパティを読み取る場合があるため、これは望ましくありません。

主な問題の解決を手伝っていただけますか (非表示のウィンドウから CanExecute メソッドを呼び出さないでください)。

4

1 に答える 1

2

CommandManagerがいつ、どこでイベントを発生させるかについて、あまり制御できないと思いますRequerySuggested。パフォーマンスの低下を軽減できる方法の 1 つは、ViewModel に の実行を抑制できるプロパティを設定することですCanExecute。ViewModel がバインドされているビューが非表示になるたびに、このプロパティをTrueに設定できます。

簡単な例

// Called when a view goes into hiding
myViewModel.SuppressCommandRequery = True

CanExecute ハンドラーで、この行をメソッドの先頭に配置するだけです。

public bool CanExecuteCommand(Object parameter) {

    if (this.SuppressCommandRequery) 
        return;

    // Continue processing the event...
}

ビューが非表示から抜け出すたびに、抑制を無効にするために特別な注意を払う必要があることを指摘します。ただし、View を再表示すると ViewModel の新しいインスタンスが生成される場合、これは必要ありません。

または、Prism MVVM フレームワークの実装の使用について説明しているこの質問をご覧ください。DeletegateCommand私はこれを自分で使用したことはありませんが、あなたの懸念のいくつかに対処できるようです.

于 2012-08-10T16:39:00.330 に答える