WPF DataGrid:编辑模式中的字段值在行

时间:2015-07-08 11:26:55

标签: c# wpf xaml datagrid

我正在使用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上的单击编辑解决方案对我不起作用。

1 个答案:

答案 0 :(得分:1)

是的,它是WPF DataGrid中的一个已知问题。

DataGrid下的所有绑定都设置为

  UpdateSourceTrigger=LostFocus

您需要覆盖此默认设置并将其设置为pdateSourceTrigger = PropertyChanged:

  <DataTemplate>
        <xctk:DecimalpDown Value="{Binding NormCalculation , UpdateSourceTrigger=PropertyChanged}"/>
  </DataTemplate>