DataContext
из FrameworkElement
- это то, с чем связан элемент. Это в основном типа object
. В шаблоне MVVM это чаще всего объект ViewModel, но это не обязательно. Это просто некоторая контекстная информация, которую вы хотите применить к этому FrameworkElement
. Само по себе это не влияет напрямую на визуальное представление.
Когда WPF хочет отобразить некоторый объект, который не имеет своего собственного визуального представления (например, не является потомком UIElement
), он посмотрит, существует ли соответствующий DataTemplate
, чтобы определить, как он должен представлять эти данные В вашем примере вы сказали, что класс UserViewModel
должен быть представлен с использованием элемента управления UserView
, но вы на самом деле не создали ни UserViewModel
, ни UserView
.
Эти два понятия часто идут вместе. Например, представьте, что у вас есть ObservableCollection<object>
, в котором есть Foo
и Bar
объект. Вы можете определить различные DataTemplate
s для Foo
и Bar
. Тогда вы можете связать свою коллекцию в ItemsControl
. Каждый объект в элементе управления получит визуальное представление на основе соответствующего DataTemplate
от его типа.
Еще один простой пример: если у вас в свой ViewModel есть свойство с именем DisplayObject
, и вы просто хотите, чтобы оно отображалось с указанным вами DataTemplate
, вы можете использовать элемент управления ContentPresenter
:
<ContentPresenter DataContext="{Binding DisplayObject}"/>
Опять же, это приводит к тому, что WPF ищет правильный шаблон для типа и использует его для построения представления.