使用DataTemplate将View连接到ViewModel

Pro*_*mer 9 wpf xaml combobox

我想了解一下.当我将View连接到ViewModel时,如下所示:

    <DataTemplate DataType="{x:Type local:MyViewModel}">
        <local:MyView />
    </DataTemplate>
Run Code Online (Sandbox Code Playgroud)

这是什么意思?

看起来View被设置为ViewModel的DataTemplate.但ViewModel没有DataTemplate的属性.那究竟是怎么回事呢?

问题的演示 - 我如何通过代码执行此操作(以特定方式连接View和ViewModel.我无法编写ViewModel.DataTemplate = View)?

谢谢.

Nit*_*tin 8

这意味着"对于其内容数据为MyViewModel的任何控件将MyView置于其中".您没有设置viewmodel的DataTemplate(这并不意味着什么)您正在为其Data为MyViewModel的控件设置DataTemplate.


era*_*zap 6

以 ItemsControl 为例,其 Items Source 为

ObservableCollection<Employee> Employees  
Run Code Online (Sandbox Code Playgroud)

其中每个 Employee 由一个 DataTemplate 表示,例如:

<DataTemplate TargetType="{x:Type local:Employee}">
       <StackPanel>
           <TextBlock Text="{Binding FirstName}" />
           <TextBlock Text="{Binding LastName}" />
       </StackPanel> 
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

因此,以同样的方式,MyViewModel.cs(例如 Employee.cs)作为基于 DataTemplate 的可视化表示。

并表示为例如:

 <ContentControl Content="{Binding MyViewModelProperty}" />
Run Code Online (Sandbox Code Playgroud)


Bri*_*dow 5

它的工作原理非常简单。您的定义DataTemplate类似于数据外观的定义。在您的示例中,您想要直观表示的数据类型为:

DataType="{x:Type local:MyViewModel}"

DataTemplate通过在控件、窗口或其他资源中定义,例如

<UserControl.Resources> ...your template... <UserControl.Resources>,

你说“嘿,我希望我的所有数据类型都local:MyViewModel像这样......”。在模板中,您定义一个根控件,它将被放置在您local:MyViewModel使用过的所有地方。通常,当您放置local:MyViewModel在 Grid、ContentControl 或其他容器中时,您将看到其字符串表示形式,如“xxxx.xxxxx.MyViewModel”,而不是视觉形式。

要查看图形表示,您必须定义一个DataTemplate. 它将替换代表您的数据的字符串“xxxx.xxxxx.MyViewModel”,并放置您在模板中定义的可视控件。然后当它完成时,这个表示 - 来自您的控制DataTemplate将获得设置为您的视图模型的 DataContext 属性,这里它将是local:MyViewModel实例。

这将使您可以在 DataTemplate 中使用绑定,将 DataTemplate 直接绑定到 ViewModel 中的属性。

现在是不是更清楚了?