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

WPF:需要使用DataGridTemplateColumn.CellTemplate在DataGrid中添加UserControl的帮助吗,wpf,user-controls,wpfdatagrid,Wpf,User Controls,Wpfdatagrid,我有一个WPF用户控件。我想在DataGrid中的每一行的第一列中添加该用户控件。我使用了DataTemplate来实现这一点。当用户点击DataGrid最后一行的ENTER键时,我添加了一个新行组织:组织选择器是下面的用户控件 <DataGridTemplateColumn Width="250" Header="{x:Static resx:Resources.Organisation}" x:Name="OrgPickerColumn" CellStyle="{StaticResou

我有一个WPF用户控件。我想在
DataGrid
中的每一行的第一列中添加该用户控件。我使用了
DataTemplate
来实现这一点。当用户点击DataGrid最后一行的ENTER键时,我添加了一个新行<代码>组织:组织选择器是下面的用户控件

<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、 如果要添加的新行是网格中的第5行,那么构造函数将被调用5次


为什么会发生这种情况?我怎样才能防止它发生?

你说你失去了控制的状态

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

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

我不知道网格到底是如何工作的,但我认为通过
网格中的虚拟化
,您的控件将被频繁地生成


希望这有帮助。

问题在于视图模型编写不正确。每次添加新行时,都会重新初始化绑定到网格的集合。因此,我修复了视图模型,它成功了

感谢大家在这里发表评论


我之所以结束这个问题,是因为解决方案过于本地化,无法在在线论坛上识别问题。

我的最佳猜测是,添加新项目时,整个DataGrid正在重新绘制。也许您可以向我们展示添加新项目的代码?WPF故意卸载不需要的控件,因此如果属性未绑定到任何对象,那么它将丢失其值。将您的选择绑定到某个对象是一种很好的做法,因为即使是最小化应用程序并将其还原,也会重新绘制(并重置)未绑定的控件。@Rachel:事实并非如此。网格还有4列,它们可以毫无问题地保留数据/状态。我很抱歉,但是很难在这里发布代码,因为它非常复杂,而且尺寸很大。如果你能进一步指导我,我将不胜感激。如果代码是绝对必要的,我将尝试在这里提取较小的代码块。您能显示按Enter键时执行的代码块吗?显示DataGrid和绑定的相关代码。(清除任何视觉信息,如边距、宽度、对齐等)