WPF DataTemplate和用户控制生命周期

时间:2011-07-06 14:08:59

标签: wpf mvvm datatemplate infragistics xamdatagrid

我有一个带有几个标签的标签控件。选择选项卡后,我将选项卡的内容设置为其对应的视图模型。

我还为基本视图模型定义了一个DataTemplate,所有其他视图模型都来自:

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

这样,我的视图模型几乎相同,将使用相同的基本视图显示。

BaseView是一个用户控件。在BaseView中,我定义了一个Infragistics XamDataGrid。似乎只为所有视图模型创建了这个网格的一个实例,这意味着我可以根据需要在选项卡之间切换多次,但用户控件永远不会从头开始重新创建。

当与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列是可见的。我的想法是,如果我可以强制完全重新创建用户控件,我可以避免这个问题。

1 个答案:

答案 0 :(得分:2)

DataTemplate添加到资源并设置x:Shared="false"