Диллема с новым элементом в WPF MVVM - PullRequest
2 голосов
/ 25 апреля 2011

Я построил форму, которая отображает свойства элементов, содержащихся в наблюдаемой коллекции.Эта наблюдаемая коллекция находится в ViewModel, к которой привязан текстовый вид представления.

Когда нажимается кнопка «Создать» в форме, новый элемент добавляется в наблюдаемую коллекцию и с помощьюcollectionview установлен на текущий элемент.Эта же форма используется.На этот раз из-за нового элемента поля пусты.

Теперь я хочу, чтобы в наблюдаемой коллекции был только один новый элемент.Из-за этого мне нужно как-то различать Предмет и Новый Предмет.

Итак, перед новым требованием у меня была следующая Наблюдаемая Коллекция в моей ViewModel:

public ObservableCollection<ItemViewModel> ItemTypes { get; private set; }

Но теперь мне нужно уметь различать новый предмет и старый.Я пытался сделать несколько вещей, таких как создание базового класса, из которого я извлекаю Item и New Item, но это кажется действительно бесполезным, так как я не могу придумать, что добавить в производные классы, они действительно толькотам, чтобы помочь увидеть, есть ли один Пустой предмет в наблюдаемой.

Что я могу сделать?

Редактировать

private void CreateNewItemType()
{
   if (DoesNewItemTypeAlreadyExist())
   {
      return;
   }

   Model.ItemType itemType = new Model.ItemType();

   ItemTypeViewModel itemTypeViewModel = new ItemTypeViewModel(itemType)
   {
     IsNew = true
   };

   ItemTypes.Add(itemTypeViewModel);
   itemTypesCollectionView.MoveCurrentTo(itemTypeViewModel);
}

private bool DoesNewItemTypeAlreadyExist()
{
    return ItemTypes.Any(a => a.IsNew == true);
}

1 Ответ

1 голос
/ 25 апреля 2011

Создайте свойство 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...