【问题标题】:WPF DataGrid: field value in Edit mode not available outside rowWPF DataGrid:编辑模式下的字段值在行外不可用
【发布时间】: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 上的单击编辑解决方案对我不起作用。

【问题讨论】:

    标签: c# wpf xaml datagrid


    【解决方案1】:

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

    一个DataGrid下的所有Bindings都设置为

      UpdateSourceTrigger=LostFocus
    

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

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

    【讨论】:

    • Eran,我的绑定 UpdateSourceTrigger 已经设置为 PropertyChanged,但从 sn-p 中删除了它。抱歉,我会更新sn-p。
    • @Michiel297 您错误地将其放在文本块上而不是 NumericUpDown 中
    • 顺便说一句,您的 GroupItem 如何知道如何重新评估组中所有项目的价值?我认为对 groupitem 失去关注是进行此评估的原因。
    • 谢谢!在我的代码中,它也在 CellEditingTemplate 的 NumericUpDown 中。
    • 我不知道这发生在哪里,这是你开箱即用的东西。我确实知道在提交值后会重新评估项目。
    猜你喜欢
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 2013-02-08
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    相关资源
    最近更新 更多