使用DataTemplate将View连接到ViewModel

时间:2013-09-11 06:29:29

标签: wpf xaml combobox

我正在努力理解。当我将View连接到ViewModel时:

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

这是什么意思?

看起来View被设置为ViewModel的DataTemplate。但ViewModel没有DataTemplate的属性。那究竟发生了什么?

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

谢谢。

3 个答案:

答案 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中的属性。

现在更清楚了吗?