WPF DataTemplate и пользовательский контроль времени жизни - PullRequest
1 голос
/ 06 июля 2011

У меня есть вкладка с несколькими вкладками. Когда вкладка выбрана, я устанавливаю содержимое вкладки для соответствующей модели представления.

У меня также есть DataTemplate, определенный для модели базового представления, из которого все остальные модели представления получены из:

    <DataTemplate DataType="{x:Type vm:BaseViewModel}">
        <view:BaseView/>
    </DataTemplate>

Таким образом, модели моего вида, которые почти идентичны, будут отображаться с использованием того же базового вида.

BaseView - это пользовательский элемент управления. В BaseView я определил Infragistics XamDataGrid. Кажется, что только один экземпляр этой сетки создан для всех моделей представлений, то есть я могу переключаться между вкладками столько раз, сколько захочу, но пользовательский элемент управления никогда не воссоздается с нуля.

Как WPF обрабатывает время жизни пользовательских элементов управления в сочетании с DataTemplates?

Проблема, которую я пытаюсь решить, заключается в том, что в xaml BaseView я определил поле в XamDataGrid следующим образом:

<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, и он не выбирает параметр Collapsed для IsDirty. В результате столбец IsDirty становится видимым. Я думал, что если я смогу заставить пользовательский элемент управления полностью воссоздаться, я мог бы избежать этой проблемы.

1 Ответ

2 голосов
/ 06 июля 2011

Добавьте DataTemplate к ресурсам и установите x:Shared="false"

...