2012-03-26 2 views
1

У меня есть свойство зависимости на элементе управления в моем представлении, которое привязано к полю на моей модели ViewModel. Когда пользователь нажимает элемент меню, я хочу, чтобы элемент управления обновил значение этого свойства, чтобы ViewModel мог сохранить его в XML-файле. Каков правильный механизм, чтобы запрос ViewModel отображал это свойство?Как может ViewModel запрашивать обновление в представлении в WPF/MVVM?

ответ

0

Ваш объект должен реализовывать интерфейс INotifyPropertyChanged и ваши свойства должны выглядеть следующим образом

private string _property; 
public string Property 
{ 
    get { return _property; } 
    set 
    { 
    if(_property == value) return; 
    _property = value; 
    RaisePropertyChanged("Property"); 
    } 
} 

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

Свойство свойства элемента меню будет привязано к команде, объявленной в модели представления, и вызовет метод на модели представления и задает значение свойства. Изменение будет каскадно зрения:

menuItem.Click -> menuItem.Command.Execute -> viewModel.method -> изменить вид модели недвижимости -> повысить свойство измененное событие -> Вид собственности изменено путем связывания

+1

Я думаю, что ОП задает обратное. View-> ViewModel, а не ViewModel-> View – GazTheDestroyer

+0

GazTheDestroyer верен. – Beth

+0

Я отредактировал мой ответ, я добавил описание, как вы можете это сделать. –

1

Как правило, элементы управления MVVM обновляют связанные свойства (не поля) сразу же после их редактирования. ViewModel - это «состояние», представление - это только один из способов увидеть это состояние.

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

+0

Спасибо за ваш ответ. Проблема в том, что для получения данных для представления требуется вызов метода. Этот метод обычно не вызывается, если данные не нужны. Данные не обновляются автоматически при изменении вида. – Beth

+0

Все еще немного неясно, какая именно последовательность вы хотите. Это ViewModel, который отвечает за получение данных. Если в какой-то момент представление должно инициировать извлечение данных, выставляют команду для этого в вашей модели ViewModel и вызывают ее из представления (ваше меню в OP?) – GazTheDestroyer

+0

ViewModel должен запускать представление для извлечения данных из себя. В представлении отображается состояние, которое необходимо захватить вызовом метода на самом элементе управления, когда элемент меню щелкнут и отправлен обратно в ViewModel. – Beth

0

У меня была проблема с тем, что viewmodel не обновлялся при нажатии на элемент меню сразу после записи в TextBox.

С помощью параметра UpdateSourceTrigger = PropertyChanged, он работал на TextBoxes:

<TextBox Grid.Column="5" Grid.Row="7" Text="{Binding SelectedPerson.Room, UpdateSourceTrigger=PropertyChanged}"></TextBox> 

Но, к сожалению, не DatePickers ...

Самое странное в том, что при нажатии на кнопку вместо пункта меню, DatePicker обновляет viewmodel. Поскольку у меня нет больше времени для поиска исправления прямо сейчас, я просто изменю свои пункты меню на кнопки.


Редактировать: проблема не в меню, а в самом меню. Когда я перемещаю menuitems из меню, он работает.

Смежные вопросы