11

我试图理解。当我像这样将 View 连接到 ViewModel 时:

    <DataTemplate DataType="{x:Type local:MyViewModel}">
        <local:MyView />
    </DataTemplate>

这是什么意思?

看起来 View 被设置为 ViewModel 的 DataTemplate。但是 ViewModel 没有 DataTemplate 的属性。那么里面到底发生了什么?

问题的演示 - 我如何通过代码来做到这一点(以这种特定方式连接 View 和 ViewModel。我不能写 ViewModel.DataTemplate = View)?

谢谢你。

4

3 回答 3

8

这意味着“对于内容数据为 MyViewModel 的任何控件,将 MyView 放在那里”。您没有设置 viewmodel 的 DataTemplate(这并不意味着什么),您正在为 Data 为 MyViewModel 的控件设置 DataTemplate。

于 2013-09-11T06:35:32.910 回答
3

以 ItemsControl 为例,其 Items Source 为

ObservableCollection<Employee> Employees  

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

<DataTemplate TargetType="{x:Type local:Employee}">
       <StackPanel>
           <TextBlock Text="{Binding FirstName}" />
           <TextBlock Text="{Binding LastName}" />
       </StackPanel> 
</DataTemplate>

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

并表示例如:

 <ContentControl Content="{Binding MyViewModelProperty}" />
于 2013-09-11T07:23:18.380 回答
2

它的工作方式非常简单。您的定义DataTemplate类似于对数据外观的定义。在您的示例中,您要直观地表示的数据是以下类型:

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

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

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

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

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

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

现在更清楚了吗?

于 2018-04-11T19:37:44.623 回答