Хорошо, когда класс реализует INotifyPropertyChanged
, класс BindingList<T>
вызывает свое событие ListChanged
для каждого события PropertyChanged
с объектом ListChangedEventArgs
, свойство ListChangedType
которого равно ItemChanged
.
Вооружившись этим знанием, я чувствую, что вы должны быть в состоянии выполнить то, что вы хотите. (Где ListChangedType == ListChangedType.ItemChanged
, передайте объект с индексом NewIndex
из BindingList<T>
в вашу службу.)
ОБНОВЛЕНИЕ : Ниже приведен пример приложения, которое я написал, чтобы продемонстрировать, что событие ListChanged
возникает при изменении элемента с помощью DataGridView
:
Класс CustomObject
: простая реализация INotifyPropertyChanged
Imports System.ComponentModel
Public Class CustomObject
Implements INotifyPropertyChanged
Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Private _name As String
Public Property Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
OnPropertyChanged("Name")
End Set
End Property
Protected Sub OnPropertyChanged(ByVal propertyName As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub
End Class
Класс DataBindingTestForm
: базовый класс Form
с DataGridView
, привязанным к BindingList(Of CustomObject)
Imports System.ComponentModel
Public Class DataBindingTestForm
Private WithEvents _customObjects As New BindingList(Of CustomObject)
Private Sub DataBindingTestForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim obj As New CustomObject
obj.Name = "John"
_customObjects.Add(obj)
obj = New CustomObject
obj.Name = "Bill"
_customObjects.Add(obj)
MainDataGridView.DataSource = _customObjects
End Sub
Private Sub _customObjects_ListChanged(ByVal sender As Object, ByVal e As ListChangedEventArgs) Handles _customObjects.ListChanged
If Not e.ListChangedType = ListChangedType.ItemChanged Then Return
Notify("ListChanged event fired. Index: {0}, Value: {1}", e.NewIndex, _customObjects(e.NewIndex).Name)
End Sub
Private Sub Notify(ByVal format As String, ByVal ParamArray args() As Object)
MsgBox(String.Format(format, args))
End Sub
End Class
При запуске вышеприведенного демонстрационного приложения, когда я изменяю значение в ячейке DataGridView
(например, с «Джона» на «Джордж»), появляется окно сообщения со следующим текстом:
ListChanged event fired. Index: 0, Value: George
Попробуйте сами и дайте мне знать, если у вас возникнут какие-либо проблемы.