我正在努力理解。当我将View连接到ViewModel时:
<DataTemplate DataType="{x:Type local:MyViewModel}">
<local:MyView />
</DataTemplate>
这是什么意思?
看起来View被设置为ViewModel的DataTemplate。但ViewModel没有DataTemplate的属性。那究竟发生了什么?
问题的演示 - 我如何通过代码执行此操作(以特定方式连接View和ViewModel。我无法编写ViewModel.DataTemplate = View)?
谢谢。
答案 0 :(得分:7)
这意味着“对于其内容数据为MyViewModel的任何控件将MyView置于其中”。您没有设置viewmodel的DataTemplate(这并不意味着什么)您正在为Data为MyViewModel的控件设置DataTemplate。
答案 1 :(得分:3)
以项目来源为
的ItemsControl为例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}" />
答案 2 :(得分:2)
它的工作方式非常简单。您对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中的属性。
现在更清楚了吗?