Создайте свойство bool для вашего элемента (например, IsDirty). Когда новый, IsDirty является ложным. В первый раз, когда что-то изменилось, установите его на true Затем вы можете проверить свойство команды для кнопки «Добавить», которая создает новый элемент, чтобы проверить и проверить, есть ли какие-либо элементы IsDirty = False в коллекции. Если это так, то установите этот элемент на выбранный. Если нет, то добавьте новый элемент и выберите его.
В прошлом то, что я делал для обнаружения изменений, - это создание словаря String, String. Словарь содержит название свойства и исходное значение. В обработчике события Changing для свойства в моем классе модели я добавляю вызов add или remove, который проверяет, есть ли элемент для этого свойства, и если да, проверяет текущее значение с изменяющимся значением. При необходимости вызовите OnPropertyChanged ("IsDirty").
Грязные проверки, чтобы видеть, есть ли какие-либо пункты в словаре. Прелесть в том, что если вы вернете значения обратно к их исходным значениям, запись вернется к статусу IsDirty = False.
Пример реализации
Private Sub OnAddress1Changing(ByVal value As String)
If Not m_dirtyFields.ContainsKey("Address1") Then
AddDirtyField("Address1", Address1)
Else
If m_dirtyFields("Address1") = value Then RemoveDirtyField("Address1")
End If
End Sub
Public m_dirtyFields As New Dictionary(Of String, String)
Private Sub AddDirtyField(ByVal ColName As String, ByVal OrigValue As String)
If Not m_dirtyFields.ContainsKey(ColName) Then
m_dirtyFields.Add(ColName, OrigValue)
OnPropertyChanged("IsDirty")
End If
End Sub
Private Sub RemoveDirtyField(ByVal ColName As String)
If m_dirtyFields.ContainsKey(ColName) Then
m_dirtyFields.Remove(ColName)
End If
OnPropertyChanged("IsDirty")
End Sub
Public ReadOnly Property IsDirty() As Boolean
Get
If m_dirtyFields.Count > 0 Then 'There are items so record is dirty
Return True
Else
Return False
End If
End Get
End Property
Cory