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