0

我一直在构建一个 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。我认为前者是两者中更有希望的,虽然当我在网格上选择或创建新行时它会触发,但当我更改单元格中的内容时它不会触发。在启用保存按钮之前,我想知道一行或多行实际上是脏的。

谢谢

4

0 回答 0