我正在使用WPF DataGrid(SelectionMode = Single,SelectionUnit = Cell)来显示已经分为两级深度的数据。我在每个第二级分组下面添加了一个摘要行来进行一些求和。用户可以编辑每行上的字段,该值是该求和的一部分。这意味着每次用户更改此字段的值时,我都想重新计算总和。
调整也可能影响同一行的另一个字段。
摘要行上的摘要绑定到您可以在DataGrid的GroupStyle元素中访问的Items集合。我的XAML片段:
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Grid>
<!-- For simplicity I've only added one summation field -->
<TextBlock Grid.Column="9"Text="{Binding Path=Items, Converter={StaticResource decimalGroupSumConverter}, ConverterParameter=AmountPerTurn}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
如您所见,总和已绑定到分组结果的Items属性。
用户可以调整的字段定义如下:
<DataGrid.Columns>
<DataGridTemplateColumn Header="Norm">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding NormCalculation}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<xctk:DecimalUpDown Value="{Binding NormCalculation, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
因此,当用户更改值时,它会直接更新同一行上的其他相关字段,但不会更新求和行。只有当焦点从更改的行移开时,总和行才会更新。
经过进一步调查后,我了解调整后的字段处于编辑模式(这会自动发生)。字段更改触发(引发propertychanged事件)该行内的任何内容,但不在外部。在我离开行之后(将焦点移到该行之外),提交更改的字段值,结果触发绑定到组级别的Items属性的控件。这会触发重新计算总和(通过转换器,如您所见)。
一切正常,但我的问题是时机。我想要的是在用户更改字段值后直接触发(并重新计算)求和。
每次用户更改其值时,我都可以通过在代码中故意提交字段来实现此目的。不需要的副作用是UI中的相关字段也离开了编辑模式,用户也点击了两次再次进入编辑模式。这不是有效的解决方案。
我的问题:有没有办法提交数据网格单元格的更改值,而不会在UI中失去编辑模式?可能是我应该绑定到另一个属性而不是'Items'?
CodePlex上的单击编辑解决方案对我不起作用。
答案 0 :(得分:1)
是的,它是WPF DataGrid中的一个已知问题。
DataGrid下的所有绑定都设置为
UpdateSourceTrigger=LostFocus
您需要覆盖此默认设置并将其设置为pdateSourceTrigger = PropertyChanged:
<DataTemplate>
<xctk:DecimalpDown Value="{Binding NormCalculation , UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>