我正在开发一个Silverlight应用程序,其中包含一个如下所示的页面:
-------------------------------- | | | | DataGrid:| DataForm: | | list of | selected | | objects | object's details | | | | --------------------------------
用户从DataGrid中选择一个对象,并显示该对象的详细信息,并可在右侧的DataForm中进行编辑。
DataGrid和DataForm都绑定到同一个PagedCollectionView
。
如果我没有对此PagedCollectionView应用过滤器,一切都很好。但是,当我应用过滤器然后尝试编辑并保存对象的详细信息时,会在RaisePropertyChanged
函数中的某处发生NullReferenceException,该函数将触发正在编辑的对象的PropertyChanged事件。此异常源自DataForm.OnCurrentItemPropertyChanged
,是由DataForm的CurrentItem突然null
引起的。
导致此错误的原因是什么,我该如何避免?
避免此问题的解决方法:在正在编辑的对象中,不是在更改属性值时立即调用RaisePropertyChanged
,而是将此方法调用延迟100毫秒。通过这种方式,DataForm和PCV可以发挥作用,只有在完成后才会执行RaisePropertyChanged调用。
这可能以某种方式阻止了PCV DataForm和正在编辑的对象之间的一些时序/同步问题,但我觉得即使输入这个解决方法也很脏:)任何人都可以使用这些信息来找出问题所在?
<controls:DataGrid
ItemsSource="{Binding ObjectsPCV}"
AutoGenerateColumns="False"
IsReadOnly="True">
<controls:DataForm
ItemsSource="{Binding ObjectsPCV}"
AutoGenerateFields="False"
AutoEdit="False"
AutoCommit="False"
CommandButtonsVisibility="Add, Edit, Navigation, Commit, Cancel">