EntityFramework EntityState и привязка данных вместе с INotifyPropertyChanged - PullRequest
2 голосов
/ 09 апреля 2010

У меня есть представление WPF, в котором отображается объект Отправка. У меня есть текстовый блок, который содержит звездочку, которая предупредит пользователя, что запись изменена, но не сохранена. Первоначально я надеялся связать видимость этого (с конвертером) со свойством Shipment.EntityState.

If value = EntityState.Modified Then
    Return Visibility.Visible
Else
    Return Visibility.Collapsed
End If

Свойство обновляется просто отлично, но представление об этом не знает. Что мне нужно знать, так это как получить пользовательский интерфейс для получения уведомлений об изменении свойства. Если это невозможно сделать, есть ли хороший способ написания моего собственного свойства IsDirty, которое обрабатывает ретракции редактирования (т. Е. Если я изменяю значение свойства, затем меняю его обратно на исходное, оно не считается как редактирование, а состояние остается без изменений).

Любая помощь, как всегда, будет принята с благодарностью.

Cory

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

После небольшой борьбы с той же проблемой, вот решение, которое работает для меня. Допустим, у меня есть объект с именем Trip, который был сгенерирован EF, мне просто нужно было расширить класс с помощью частичного класса, как показано ниже. Метод RaiseEntityStateChanged полезен, когда необходимо принудительно обновить свойство EntytyState, например, после вызова метода SaveChanges контекста.

partial class Trip
{
   bool _forced = false;
   System.Data.EntityState _lastState;

   public Trip()
   {
     _lastState = EntityState;
     this.PropertyChanged += (s, e) => 
     {
       if (_lastState != this.EntityState && e.PropertyName != "EntityState" || _forced)
       {
          _forced = false;
          OnPropertyChanged("EntityState");
       }

       _lastState = this.EntityState;
    };
  }

  public virtual void RaiseEntityStateChanged()
  {
     _forced = true;
     OnPropertyChanged("EntityState");
  }
}
1 голос
/ 09 апреля 2010

Я не вижу способа создать привязку XAML для существующего свойства, чтобы делать то, что вы пытаетесь сделать. Но вы можете написать собственное свойство IsDirty, основанное на EntityState; Вы можете обновить это значение, подписавшись на событие PropertyChanged, вызванное базовым объектом EntityObject. Конечно, вам нужно также вызвать событие PropertyChanged для IsDirty (чтобы GUI был уведомлен) и игнорировать это событие в вашем обработчике (чтобы предотвратить бесконечную рекурсию). Изменить: после ОП добавил следующее:

Вот как я это вижу, чтобы ответить на комментарий.

В классе отгрузки можно добавить:

public bool IsDirty { get { return EntityState == EntityState.Modified; } }

public Shipment() {
...
PropertyChanged += OnShipmentChanged;
}

private void OnShipmentChanged(object sender, PropertyChangedEventArgs pcea) {
    if (pcea.PropertyName != "IsDirty") { // prevent recursion
        OnPropertyChanged("IsDirty"); // notifies binding listener that the state has changed
    }
}

Ночью я подумал о другом пути, который заключается в создании мультисвязывания для каждого свойства Shipment (которое заменило бы все это понятие свойства IsDirty и фактически ответило бы на исходный вопрос). Это может иметь смысл, если есть только пара свойств отгрузки. Я бы сказал, что если их больше 3, мы должны забыть об этой идее.

...