Как работает данная ViewModel?

186
01 июня 2018, 19:50

Немного не понимаю магию этого кода:

      public partial class MainWindow : Window, IModel
        {
            readonly ViewModel _viewModel = new ViewModel();
            public MainWindow()
            {
                InitializeComponent();
                DataContext = _viewModel;
            }
          public void SetModel(string value)
        {
            _viewModel.SetModel(value);
            this.ShowDialog();
        }
    }
    public class ViewModel : INotifyPropertyChanged
    {
        private Model _model;
        public string ModelName
        {
            get { return _model.ModelName; }
            set
            {
                _model.ModelName = value;
                OnPropertyChanged("ModelName");
            }
        }
public void SetModel(string value){
_model=new Model(value)
}
     protected virtual void OnPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
      class Model
    {
        public string ModelName { get; set; }
        public Model(string name){
            ModelName=name
        }
    }

Почему при данной реализации, при создании типа Model, значение сразу же отображается с забинженном поле? Хотя OnPropertyChanged("ModelName"); не вызывался явно.

Answer 1

Все стили и привязки применяются после вызова метода Show()/ShowDialog() окна (в этот момент срабатывает событие Loaded, читайте комментарии здесь и здесь), поэтому, когда фреймворк первый раз читает свойства VM, в них уже есть значения.

Если вы затем уже где-то смените значение

_model = new Model("XXX");

то WPF об этом, естественно, не узнает и не обновит представление.

READ ALSO
Максимальное разрешение экрана

Максимальное разрешение экрана

Сделал свою шапку для окна, и хочу добавить туда стандартные кнопки "свернуть", "развернуть", и "закрыть"Всё как бы хорошо, но при развертывании...

177
Locks и IsolationLevel

Locks и IsolationLevel

У меня есть такой код модуля статистики:

188
Парсер страницы

Парсер страницы

когда пытаюсь вывести значения в CheckedListBox значения, на переменную node2 выскакивает ошибка SystemNullReferenceException: "Ссылка на объект не указывает на экземпляр...

205
Как вернуть строку черз маршалинг

Как вернуть строку черз маршалинг

Нужно вернуть строку с кода написанного на С++ в С#

192