0

MVVM アーキテクチャで TabControl を完璧に実行するのに苦労しています。現在私がやっていることは、TabControl の ItemsSource プロパティを ObservableCollection Screens プロパティにバインドすることです。新しいタブを追加するたびに、適切な ViewModel を作成し、それを画面に追加すると、データ テンプレートを通じて適切なビューが表示されます。

問題:

1) アプリケーションが完全に閉じるまで、ViewModel のデストラクターが起動されないようです。データ テンプレートが原因かどうかはわかりません。ViewModel を Screens コレクションから削除すると、GC で使用できるようになります。これは、ビューを表示する Screens コレクションに追加しただけで、ビューを閉じるコマンドが発行されたときにコレクションから削除したためです。その後、Gc.Collect を強制しようとしましたが、まだ dctor はアプリケーションの終了時にのみ起動します。なぜこれが起こっているのかわかりません...

1) 一部のデータ構造では、ElementName を介して ViewModel のプロパティにバインドできないため、RelativeSource バインディングを使用する方法があります。ただし、これにより、要素 (ビューなど) が閉じられているときに、多くのバインディング例外が作成されます。私と同様の問題がここで説明されています:

親が削除されたときにバインディングエラーを回避する方法

私の場合、TargetNullValue と FallbackValue は役に立ちません。私が見つけた唯一の回避策は、ViewModel を StaticResource にすることです。このアプローチの問題は、Screens コレクションとデータ テンプレートを使用して View と ViewModel を接続する場合、通常の方法では ViewModel を作成できないことです。

<UserControl.Resources>
    <vm:SomeViewModel x:Key="someViewModel" />
</UserCpntrol.Resources>

それで、MVVMシナリオでTabControlを使用する別のアプローチがありますか、それともここで何か間違っていますか?

4

1 に答える 1

0

デストラクタ部分については、デストラクタを使用しないでください。代わりに、 IDisposableインターフェイスを実装することをお勧めします。これは、オブジェクトのクリーンアップを自動化し、GCにダーティな作業を行わせるのに役立ちます。

このメソッドを使用して、このインターフェイスを実装するクラスのインスタンスによって保持されているファイル、ストリーム、ハンドルなどのアンマネージリソースを閉じたり解放したりします。慣例により、このメソッドは、オブジェクトが保持しているリソースの解放、またはオブジェクトの再利用の準備に関連するすべてのタスクに使用されます。

私のお気に入りのMVVMチュートリアルでは、Tabcontrolを中央のUIコントロールとして使用しています。Model -View-ViewModelデザインパターンを使用したWPFアプリです。これはあなたに素晴らしいそして働くアプローチへのヒントを与えるかもしれません。

于 2012-08-14T21:13:31.887 に答える