Как отобразить изменения данных в представлении MVVM? - PullRequest
0 голосов
/ 28 февраля 2012

Я начинаю использовать MVVM, но я что-то запутался, есть моя проблема, я хочу добавить только одну строку в мою таблицу, и вот способ, которым я делаю это:

Класс представления модели:

   // Model.MyClass is my entity
    Model.MyClass myClass;
    public Model.MyClass  MyClass
    {
        get
        {
            return myClass;
        }
        set
        {
            myClass= value;
            base.OnPropertyChanged(() => MyClass);
        }
    }

     context = new myEntities();
     myclass=new Model.MyClass();
     context.MyClass.AddObject(MyClass); 

Тогда:

 public ICommand SaveCommand
 {
     get { return new BaseCommand(Save); }
 }
 void Save()
 {
     if (DefaultSpecItem != null)
     {
        context.SaveChanges();
     }
 }

и я связываю шаблон данных с MyClass, он отлично работает и сохраняет изменения в моей базе данных, но не обновляет мое представление, в этом случае я хочу вернуть идентификатор, поэтому я помещаю текстовое поле и привязываю его к id (prpoerty ), в чем проблема? я что-то упустил? я бы оценил любую помощь.

1 Ответ

1 голос
/ 02 марта 2012

Вы должны реализовать INotifyPropertyChanged, чтобы заставить работать привязку. Обычно эта реализация перемещается в модель представления, которая оборачивает свойства модели и добавляет к ней уведомление об изменении. Тем не менее, нет ничего плохого в том, чтобы делать это напрямую в модели. В этом случае вы обычно делаете модель напрямую доступной в модели представления через свойство и используете точечную нотацию для разгона (т.е. VM.Model.Property).

Лично я предпочитаю оборачивать свойства, поскольку это обеспечивает большую гибкость, а также делает связывание более понятным.

Итак, вот пример, основанный на вашей модели:

public class ModelViewModel : ViewModelBase {
    public ModelViewModel() { 
        // Obtain model from service depending on whether in design mode
        // or runtime mode use this.IsDesignTime to detemine which data to load.
        // For sample just create a new model
        this._currentData = Model.MyClass();
    }

    private Model.MyClass _currentData;

    public static string FirstPropertyName = "FirstProperty";

    public string FirstProperty {
        get { return _currentData.FirstProperty; }
        set {
            if (_currentData.FirstProperty != value) {
                _currentData.FirstProperty = value;
                RaisePropertyChanged(FirstPropertyName);
            }
        }
    }

    // add additional model properties here

    // add additional view model properties - i.e. properties needed by the 
    // view, but not reflected in the underlying model - here, e.g.

    public string IsButtonEnabledPropertyName = "IsButtonEnabled";

    private bool _isButtonEnabled = true;

    public bool IsButtonEnabled {
        get { return _isButtonEnabled; }
        set {
            if (_isButtonEnabled != value) {
                _isButtonEnabled = value;
                RaisePropertyChanged(IsButtonEnabledPropertyName);
            }
        }
    }
}
...