【发布时间】:2015-07-08 11:26:55
【问题描述】:
我正在使用 WPF 数据网格(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 中的编辑模式的情况下提交数据网格单元格的更改值?可能我应该绑定到“项目”以外的另一个属性?
CodePlex 上的单击编辑解决方案对我不起作用。
【问题讨论】: