Я пытаюсь получить ObservableCollection
, чтобы запустить событие CollectionChanged
, когда изменяется свойство объекта. Я использовал код от here, но, возможно, я сделал ошибку при переводе с C# на Vb.net. В любом случае item_PropertyChanged
не стреляет. Что мне здесь не хватает?Обновление ObservableCollection по изменению свойства объекта
Код:
Imports System.ComponentModel
Imports System.Collections.Specialized
Imports System.Collections.ObjectModel
Class MainWindow
Public Class TrulyObservableCollection(Of T As INotifyPropertyChanged)
Inherits ObservableCollection(Of T)
Public Sub New()
MyBase.New()
AddHandler CollectionChanged, AddressOf TrulyObservableCollection_CollectionChanged
End Sub
Private Sub TrulyObservableCollection_CollectionChanged(sender As Object, e As NotifyCollectionChangedEventArgs)
If e.NewItems IsNot Nothing Then
For Each item As [Object] In e.NewItems
AddHandler TryCast(item, INotifyPropertyChanged).PropertyChanged, AddressOf item_PropertyChanged
Next
End If
If e.OldItems IsNot Nothing Then
For Each item As [Object] In e.OldItems
RemoveHandler TryCast(item, INotifyPropertyChanged).PropertyChanged, AddressOf item_PropertyChanged
Next
End If
End Sub
Private Sub item_PropertyChanged(sender As Object, e As PropertyChangedEventArgs)
Dim a As New NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)
OnCollectionChanged(a)
End Sub
End Class
Public Class edm
Implements INotifyPropertyChanged
Property ip As String
Property status As String
Public Sub New(ip As String, status As String)
Me.ip = ip
Me.status = status
End Sub
Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
End Class
Public Property edms As New TrulyObservableCollection(Of edm)
Public Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
DataContext = Me
edms.Add(New edm("192.168.1.111", "On"))
edms.Add(New edm("192.168.1.112", "Off"))
edms.Add(New edm("192.168.1.113", "On"))
End Sub
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
edms.Where(Function(edm) edm.ip = "192.168.1.111").First().status = "Off"
End Sub
End Class
Edit:
Оба Бьорн и Liero при условии, большие ответы и в этой ситуации мне трудно отметить один, как правильно, а не другой, так мои рассуждения на мой выбор что, хотя пост Бьорна ответил на мой вопрос, как я выразился, я отметил ответ Лиеро, поскольку его комментарии привели меня к лучшему решению для моего сценария.
Спасибо за информацию. Я не знал о живом формировании, поэтому читал на нем. Мне интересно, однако, в моем сценарии, где у меня есть статический список машин и вы хотите обновить статус с заданным интервалом и внести те изменения, которые отражены в 'DataGrid', как мне реализовать живое форматирование?Я не собираюсь группировать, фильтровать или сортировать, так что это правильный подход здесь? – doovers
Он должен просто работать. Вам вообще не требуется ObservableCollection. Событие CollectionChanged имеет смысл только тогда, когда вам нужно добавлять/удалять элементы из коллекции и отражать их в datagrid. ObervableCollection.PropertyChanged уведомляет только об изменении свойства Count. Если вы хотите просто обновить ячейку в datagrid при выполнении chages, вам необходимо запустить событие propertychanged в вашей «машинной» сущности. Связывание автоматически обновит ячейку. Если это не проблема, это где-то в другом месте, но, конечно, не в событии CollectionChanged – Liero
Спасибо. Кажется, я поступил неправильно. Получил его, нажав 'PropertyChanged' в свой установщик свойств класса, как вы предложили. – doovers