Видовая модель WPF MVVM, содержащая не обновляющиеся видовые модели

#wpf #mvvm #view-model-pattern

#wpf #mvvm #view-model-шаблон

Вопрос:

Я новичок в WPF и MVVM, и это доставляло мне много головной боли. Из-за проблем с навигацией я решил просто отобразить все мое содержимое сразу. Я думал, что создам новую ViewModel ( MainViewModel ), чтобы содержать две мои другие ViewModels ( StudentViewModel и AddStudentsViewModel ).

MainViewModel содержит что-то вроде этого:

 private StudentViewModel _studentVM;
private AddStudentsViewModel _addStudentsVM;

public StudentViewModel StudentVM
{
    get { return _studentVM; }
    set
    {
        if (_studentVM != value)
        {
            _studentVM = value;
            NotifyPropertyChanged("StudentVM");
        }
    }
}
  

(public AddStudentsViewModel AddStudentsVM также существует, я просто пытаюсь сократить это)

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

Я что-то упускаю в MainViewModel ? Или ViewModel не может видеть изменения в любых других ViewModels внутри него?

Комментарии:

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

2. Вам нужно будет предоставить метод для ваших дочерних моделей просмотра, который позволяет вам создавать NotifyPropertyChanged() для них. Тогда в методах вы можете просто использовать пустую строку для имени свойства, что вызывает обновление для всех привязок в представлении из этой модели представления.

3. Вам нужно добавить еще немного информации к вашему вопросу. Для какого свойства вы вызываете установщик? Каким образом представление ссылается на datacontext? Как выглядит привязка в xaml? Чего вы ожидаете, и что вы на самом деле получаете? Предоставьте эту информацию, и вы, вероятно, получите более конкретные ответы.

Ответ №1:

Если ваше представление привязано к некоторому свойству внутри StudentViewModel посредством вложенной навигации по свойству StudentVM like StudentVM.Property , то для отражения изменений в StudentVM.Property вашем представлении потребуется, чтобы вы уведомили представление, которое StudentVM (не StudentVM.Property ) изменилось.

Таким образом, это зависит от того, как вы определили свою привязку и для какого свойства вы вызываете PropertyChanged событие.

Ответ №2:

Viewmodel, который содержит две другие viewmodels. Просто подумайте об этом на секунду. Это не очень хорошая идея.

В любом случае, вы также должны реализовать INotifyPropertyChanged в своих viewmodels, содержащих viewmodels. Не только в содержащей MainViewModel.

Может быть, это ошибка?

Комментарии:

1. Что не так в практике модулирования функциональных возможностей приложения в небольших классах и объединения этих классов вместе? Это то, для чего был создан ООП.

2. Если вы объявите это «не очень хорошей идеей», по крайней мере, скажите нам, почему. Я, честно говоря, не знаю, что с этим не так.