我有一个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次!
为什么会这样?我该如何防止它发生?
答案 0 :(得分:0)
你说你失去控制的状态。
我认为你必须在ui / control后面的视图模型中存储控件的相关数据(每个绑定等)。
您的控件/列只是数据的演示者。
我不知道网格是如何工作的,但我认为Grid
中的虚拟化会控制你的控件生成频率。
希望这有帮助。
答案 1 :(得分:0)
问题是视图模型编写不正确。每次添加新行时,都会重新初始化绑定到网格的集合。所以我修复了视图模型并且它有效。
感谢所有人在此发表评论。
我正在结束这个问题,因为解决方案过于局部化,无法在网上论坛上发现问题。