いくつかのタブを持つタブ コントロールがあります。タブが選択されると、タブのコンテンツを対応するビュー モデルに設定します。
また、他のすべてのビュー モデルの派生元である基本ビュー モデル用に定義された DataTemplate もあります。
<DataTemplate DataType="{x:Type vm:BaseViewModel}">
<view:BaseView/>
</DataTemplate>
このようにして、ほぼ同一のビュー モデルが同じベース ビューを使用して表示されます。
BaseView はユーザー コントロールです。BaseView には、Infragistics XamDataGrid が定義されています。すべてのビュー モデルに対してこのグリッドのインスタンスが 1 つだけ作成されているようです。つまり、タブを何度でも切り替えることができますが、ユーザー コントロールが最初から再作成されることはありません。
DataTemplates と組み合わせた場合、WPF はユーザー コントロールの有効期間をどのように処理しますか?
私が解決しようとしている問題は、BaseView の xaml で、次のように XamDataGrid で Field を定義したことです。
<igDP:XamDataGrid.FieldLayouts>
<igDP:FieldLayout>
<igDP:FieldLayout.FieldSettings>
<igDP:FieldSettings DataValueChangedNotificationsActive="true"
AllowCellVirtualization="False"
AllowResize="True"
AllowRecordFiltering="True"/>
</igDP:FieldLayout.FieldSettings>
<igDP:Field Name="IsDirty" Visibility="Collapsed"/>
</igDP:FieldLayout>
</igDP:XamDataGrid.FieldLayouts>
IsDirty 列 (すべてのビュー モデルに IsDirty プロパティがあります) は、グリッドが最初に表示されたときにのみ正しく折りたたまれます。別のタブをクリックすると、グリッドのデータ ソースが変更され、グリッドによって新しい FieldLayout が作成され、IsDirty の Collapsed 設定が取得されません。その結果、IsDirty 列が表示されます。ユーザー コントロールを完全に再作成することができれば、この問題を回避できると考えました。