Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF DataGrid绑定的分组项触发太晚_C#_Wpf_Xaml_Datagrid - Fatal编程技术网

C# WPF DataGrid绑定的分组项触发太晚

C# WPF DataGrid绑定的分组项触发太晚,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,我使用WPF DataGrid来显示分为两个级别的数据。大多数XAML/代码都基于上的MSDN示例 除了这个示例之外,我还在每个第二级分组下面添加了一个汇总行,以进行一些汇总。用户可以更改影响一个或多个总和的行。每次用户进行更改时,应直接重新计算总和,以查看更改的结果 除了摘要行更新之外,所有功能都可以正常工作。用户更新网格中的字段后,不会重新计算总和。实际上,不会触发求和的绑定来调用转换器进行新的求和。我发现,当用鼠标单击将焦点更改为数据网格的另一部分(更改的行之外!)时,确实会触发 让我澄清

我使用WPF DataGrid来显示分为两个级别的数据。大多数XAML/代码都基于上的MSDN示例

除了这个示例之外,我还在每个第二级分组下面添加了一个汇总行,以进行一些汇总。用户可以更改影响一个或多个总和的行。每次用户进行更改时,应直接重新计算总和,以查看更改的结果

除了摘要行更新之外,所有功能都可以正常工作。用户更新网格中的字段后,不会重新计算总和。实际上,不会触发求和的绑定来调用转换器进行新的求和。我发现,当用鼠标单击将焦点更改为数据网格的另一部分(更改的行之外!)时,确实会触发

让我澄清我的XAML/代码的相关部分…

为了获得属于这个组的行,我绑定到Items属性并将它们发送到转换器。在XAML中,此摘要行显示在元素的元素中:


为求和调用的转换器:

public class DecimalGroupSumConverter:IValueConverter
{
公共对象转换(对象值,系统类型targetType,
对象参数,
System.Globalization.culture(信息文化)
{
if(null==值)
返回“null”;
ReadOnlyObservableCollection项=
(ReadOnlyObservableCollection)值;
if(parameter.ToString()=“AmountPerYear”)
{
变量总和=(从项目中的i开始)
选择((ObservableCalculatedActivity)i).AmountPerYear.Sum();
返回string.Format(“{0:c}”,sum);
}
其他的
{
返回null;
}
}
公共对象转换回(对象值,System.Type targetType,
对象参数,
System.Globalization.culture(信息文化)
{
抛出新系统。NotImplementedException();
}
}
下一个列表显示了我试图强制更新UI但未成功的尝试:

  • 通过删除并重新添加更改的行来更改基础sourcecollection
  • 在视图的ICollectionView接口上调用Refresh()方法
  • 对集合重新排序
  • 根据以下链接刷新datagrid:

请,有人能帮我解决这个关于更新UI的小问题吗?

当前,您的绑定设置为在焦点丢失时更新绑定属性。要解决此问题,只需将
UpdateSourceTrigger
添加到绑定中即可

Text="{Binding Path=Items, UpdateSourceTrigger=PropertyChanged ...

这将强制在属性更改时调用
INotifyPropertyChanged
,因此也将调用转换器。

当用户调整datagrid中的字段时,我发现基础集合处于编辑模式。这些更改保存在内存中的某个位置,尚未刷新到我的XAML中组级别的绑定项集合。要刷新更改并触发项绑定,只需执行提交。在我的例子中,我首先必须将我的ICollectionView转换为ListCollectionView:

ICollectionView集合视图;
((ListCollectionView)collectionView).CommittedIt();
collectionView.Refresh();

不幸的是,提交时有一个副作用:相关字段离开编辑模式,用户应单击两次以再次进入编辑模式。

谢谢Mike,但这没有效果。我认为触发器应该来自其他地方,因为用户没有更改绑定到“Items”的字段。“Items”属性是否实现INotifyPropertyChanged接口?