WPF:需要帮助使用DataGridTemplateColumn.CellTemplate在DataGrid中添加UserControl

时间:2011-12-13 12:56:26

标签: wpf user-controls wpfdatagrid

我有一个WPF UserControl。我想在DataGrid的每一行的第一列中添加该用户控件。我使用DataTemplate来实现这一目标。当用户在DataGrid的最后一行中按Enter键时,我添加了一个新行。 Organisation:OrganisationPicker是下面的UserControl。

<DataGridTemplateColumn Width="250" Header="{x:Static resx:Resources.Organisation}" x:Name="OrgPickerColumn" CellStyle="{StaticResource SingleClickEditing}">                                
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <Grid >
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="*" Name="column1"></ColumnDefinition>
          <!--<ColumnDefinition Width="0.1*"></ColumnDefinition>-->
        </Grid.ColumnDefinitions>

        <Organisation:OrganisationPicker Width="240"
                                         HorizontalAlignment="Left" Margin="2,2,2,2"
                                         Name="orgPicker"
                                         VerticalAlignment="Top"
                                         Grid.Column="0"
                                         IsValidSearch="{Binding OrganisationError,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=true, NotifyOnValidationError=true,NotifyOnSourceUpdated=True}" 
                                         SelectedOrganisationalUnit="{Binding Path=ReqOrganisationId,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=true, NotifyOnValidationError=true,NotifyOnSourceUpdated=True}"
                                         Foreground="{DynamicResource ContentForeground}" FontFamily="{DynamicResource DefaultFontFamily}" FontSize="{DynamicResource NormalFontSize}">
        </Organisation:OrganisationPicker>                                           
      </Grid>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

添加了用户控件但是当输入新行时,用户控件的构造函数被调用为网格中行数的次数,显然我失去了用户控件实例的状态已存在的行。

e.g。如果要添加的新行是网格中的第5行,则构造函数被调用5次!

为什么会这样?我该如何防止它发生?

2 个答案:

答案 0 :(得分:0)

你说你失去控制的状态。

我认为你必须在ui / control后面的视图模型中存储控件的相关数据(每个绑定等)。

您的控件/列只是数据的演示者。

我不知道网格是如何工作的,但我认为Grid中的虚拟化会控制你的控件生成频率。

希望这有帮助。

答案 1 :(得分:0)

问题是视图模型编写不正确。每次添加新行时,都会重新初始化绑定到网格的集合。所以我修复了视图模型并且它有效。

感谢所有人在此发表评论。

我正在结束这个问题,因为解决方案过于局部化,无法在网上论坛上发现问题。