Как View знает, что ViewModel использовать в WPF?
Может кто-нибудь объяснить, как связаны View и ViewModel? Я не могу найти нигде xaml или xaml.cs для представления, ссылающегося на ViewModel, и ничего в файле ViewModel.cs, который ссылается на представление, но они каким-то образом связаны и привязывают членов из ViewModel к работе View,
Кроме того, в конструкторе каждого есть только InitializeComponent для представления и базовый конструктор для ViewModel (без объявления/определения View).
Спасибо!
Ответы
Ответ 1
Здесь есть различные варианты.
Что-то должно установить View DataContext
как экземпляр ViewModel. Здесь есть много вариантов:
- Это можно сделать непосредственно в xaml (просмотр просто экземпляров ViewModel напрямую).
- Это можно сделать в конструкторе вида (
this.DataContext = new MyViewModel();
)
- Это можно обрабатывать с помощью
DataTemplate
- "Координирующий" класс может связывать их вместе (т.е. отдельный класс "презентатор" может построить оба и установить
DataContext
соответственно)
Наиболее распространенными являются либо просмотр представления виртуальной машины в xaml (первый вид), либо все, что основано на ориентированной на ViewModel точке зрения, и WPF автоматически создает представление на основе связанной виртуальной машины (ViewModel-первых).
Первый подход - это то, что используется множеством наборов инструментов, таких как MVVM Light. Последний подход - это то, что я использовал в моей блоге
Ответ 2
"Чистый" способ подключения представлений к моделям просмотров будет...
Когда вы создаете представления для каждого представления, установите его DataSource в свою модель представления:
например.
public class App
{
private void OnAppStart()
{
var model = new MainModel();
var vm = new MainVM();
var view = new MainWindow();
vm.Model = model;
view.DataSource = vm;
view.Show();
}
}
Когда модель, которую вы просматриваете, изменяется, обновите VM:
public class MainVM
{
private void OnSelectedModelItemChanged()
{
this.SelectedItem = new ItemVM();
this.SelectedItem.Model = this.SelectedModelItem;
}
}
И используйте шаблоны данных, чтобы сделать вид, выберите правильные подвыборы для каждой виртуальной машины.
Ответ 3
В представлении содержится объект класса модели представления в xaml.
Функция InitializeComponent создает все элементы управления на странице, устанавливает стили и т.д.