2013-03-28 4 views
2

Это простой вопрос, и я быстро искал Интернет в течение нескольких часов ...Как синхронизировать модель и просмотреть модель двунаправленную в MVVM?

У меня есть модель и модель с одним свойством. Чтобы сделать это свойство видимым в представлении, я использую объект view-model, который должен автоматически генерироваться из объекта модели и наоборот. Конечно, следующий код будет генерировать исключение StackOverflowException, поскольку обновление модели-объекта в модели вызывает обновление объекта-модели view в модели представления, и это вызывает обновление модельного объекта в модели и так далее ...

class ModelObject 
{ 
    ... 
} 

class ViewModelObject 
{ 
    ... 
} 

class Model : INotifyPropertyChanged 
{ 
    private ModelObject modelObject = new ModelObject(); 

    ... 

    public ModelObject ModelObject 
    { 
    get 
    { 
     return this.modelObject; 
    } 
    set 
    { 
     this.modelObject = value; 
     this.NotifyPropertyChanged("ModelObject"); 
    } 
    } 
} 

class ViewModel : INotifyPropertyChanged 
{ 
    private ViewModelObject viewModelObject = new ViewModelObject(); 
    private Model model = new Model(); 

    ... 

    public ViewModel() 
    { 
    this.model.PropertyChanged += new PropertyChangedEventHandler(this.propertyChangedEvent); 
    } 

    public ViewModelObject ViewModelObject 
    { 
    get 
    { 
     return this.viewModelObject; 
    } 
    set 
    { 
     this.viewModelObject = value; 
     this.model.ModelObject = new ModelObject(...); 
     this.NotifyPropertyChanged("ViewModelObject"); 
    } 
    } 

    private void propertyChangedEvent(object sender, PropertyChangedEventArgs e) 
    { 
    if (e.PropertyName.Equals("ModelObject")) 
    { 
     this.ViewModelObject = new ViewModelObject(...); 
    } 
    } 
} 

Каков общий способ синхронизации этих двух объектов?

+0

Какое применение этого поведения? Где вы его используете? Что ты пытаешься сделать? – Floremin

+0

Я думаю, что базовым в MVVM является синхронизация модели представления и модели. Мне нужно это поведение постоянно в разных случаях. – user2220511

ответ

4

Нет серебряной пули. Поскольку модель представляет собой представление базы данных, а viewmodel ближе к интерфейсу, всегда существует некоторая бизнес-логика, необходимая для преобразования модели для просмотра модели и наоборот.

Я обычно есть два метода в моей точки зрения модели класса - SyncModel(ViewModel viewModel) и SyncViewModel(Model model)

Еще одно предложение -

Модель не должна реализовать INotifyPropertyChanged. Модель представления должна реализовать это как ее привязку к пользовательскому интерфейсу. Почему модель должна измениться? Он представляет, что находится в db. Вы можете обновить его, но почему вам нужны уведомления об изменении для модели?

Edit: MVVM: Binding to Model while keeping Model in sync with a server version

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

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

Существует также event aggregator, который может пригодиться.

Если вы хотите отсроченное обновление, потребуется свойство isDirty. Вы знаете свое приложение лучше, google для большего количества статей и выбирайте с умом.

+1

Модель в моем примере не представляет собой базу данных - это простая модель в памяти. Таким образом, модель также может быть изменена с помощью другой модели представления, например, и вышеприведенная модель представления должна быть проинформирована об этом, чтобы запустить событие INotifyPropertyChanged, которое приведет к обновлению интерфейса. – user2220511

+0

проверить мои изменения, обновить ссылку и еще один текст. –

+0

Спасибо за ваш ответ. Я попробую так! – user2220511