【问题标题】:connect View to ViewModel with DataTemplate使用 DataTemplate 将 View 连接到 ViewModel
【发布时间】:2013-09-11 06:29:29
【问题描述】:

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

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

这是什么意思?

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

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

谢谢。

【问题讨论】:

    标签: wpf xaml combobox


    【解决方案1】:

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

    【讨论】:

    • 控件的“内容数据”是指它的DataContext?
    • 没有。控件的内容,例如 。这里我将控件的内容设置为控件 DataContext 中的 MyViewModel 属性。所以你的模板将在这里应用
    • 我不确定我是否理解。我的 View 是一个 UserControl,所以没有任何控件可以让 View 成为它的 Content。
    • 这是否意味着如果您实例化一个具有指定视图的数据模板的视图模型,该视图将显示为与绑定到数据上下文的视图模型?
    【解决方案2】:

    以 ItemsControl 为例,其 Items Source 为

    ObservableCollection<Employee> Employees  
    

    每个员工都由一个 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}" />
    

    【讨论】:

    • 我不明白的一点是,当 ViewModel 没有 DataTemplate 时,“基于 DataTemplate 的视觉表示”如何。如果谈到那个 ContentControl 的 DataTemplate,我没有一个 ContentControl,它的内容是 MyViewModel。我的 View 是一个控件,我不给它 ViewModel 作为内容。
    • DataTempalte 是逻辑对象到可视对象的可视化映射,你的逻辑对象不需要包含他的表现方式。
    【解决方案3】:

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

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

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

    &lt;UserControl.Resources&gt; ...your template... &lt;UserControl.Resources&gt;,

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

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

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

    现在更清楚了吗?

    【讨论】:

      猜你喜欢
      • 2011-05-03
      • 1970-01-01
      • 2014-07-12
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多