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を使用する別のアプローチがありますか、それともここで何か間違っていますか?