我一直在构建一个 wpf 用户控件来充当数据导航器,用于各种表单。它将来自视图模型的底层 ICollectionView 作为数据源,就像网格等表单上的其他控件一样。网格上的视图是这样设置的;
Public Shared ReadOnly DataIcvProperty As DependencyProperty = DependencyProperty.Register("DataIcv", GetType(ICollectionView), GetType(DataNavigator), New FrameworkPropertyMetadata(Nothing, New PropertyChangedCallback(AddressOf OnDataIcvChanged)))
<Description("The CollectionView (as an ICollectionView) to be passed to the DataNavigator control"), Category("Vtl DataNavigator Main Properties")>
Public Property DataIcv As ICollectionView
Get
Return CType(GetValue(DataIcvProperty), ICollectionView)
End Get
Set(ByVal Value As ICollectionView)
SetValue(DataIcvProperty, Value)
End Set
End Property
Private Shared Sub OnDataIcvChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
Dim dn As DataNavigator = CType(d, DataNavigator)
dn.RecordsCount = dn.GetRecordCount
dn.Records.Text = dn.RecordsCount.ToString
dn.UpdateUi()
If e.OldValue IsNot Nothing Then
RemoveHandler dn.DataIcv.CollectionChanged, AddressOf dn.OnDataIcvCollectionChanged
RemoveHandler dn.DataIcv.CurrentChanged, AddressOf dn.OnDataICVCurrentChanged
RemoveHandler dn.DataIcv.CurrentChanging, AddressOf dn.OnDataIcvCurrentChanging
End If
If e.NewValue IsNot Nothing Then
AddHandler dn.DataIcv.CollectionChanged, AddressOf dn.OnDataIcvCollectionChanged
AddHandler dn.DataIcv.CurrentChanged, AddressOf dn.OnDataICVCurrentChanged
AddHandler dn.DataIcv.CurrentChanging, AddressOf dn.OnDataIcvCurrentChanging
End If
End Sub
Private Sub OnDataICVCurrentChanged(ByVal sender As Object, ByVal e As EventArgs)
Record.Text = (DataIcv.CurrentPosition + 1).ToString
UpdateUi()
End Sub
Private Sub OnDataIcvCurrentChanging(ByVal sender As Object, ByVal e As EventArgs)
'MessageBox.Show("I've Changed")
End Sub
Private Sub OnDataIcvCollectionChanged(ByVal sender As Object, ByVal e As EventArgs)
MessageBox.Show("I've Changed")
End Sub
一个典型的形式可能是这样的:
现在我想做的是确定底层视图集合何时变脏,以便我可以使用该信息来启用禁用导航器控件上的保存按钮等功能。我已经尝试过 CurrentChanging 和 CollectionChanged。我认为前者是两者中更有希望的,虽然当我在网格上选择或创建新行时它会触发,但当我更改单元格中的内容时它不会触发。在启用保存按钮之前,我想知道一行或多行实际上是脏的。
谢谢