【问题标题】:In MVVM are DataTemplates considered Views as UserControls are Views?在 MVVM 中,DataTemplates 是否将 Views 视为 UserControls 是 Views?
【发布时间】:2010-11-04 05:57:11
【问题描述】:

在 MVVM 中,每个 View 都有一个 ViewModel。我理解的视图是一个窗口、页面或用户控件,您可以将视图模型附加到其中,视图从中获取其数据。

但是 DataTemplate 也可以渲染 ViewModel 的数据。

所以我理解 DataTemplate 是另一个“视图”,但似乎存在 差异,例如Windows、Pages 和 UserControls 可以定义自己的 .dll,一种类型通过附加模板与 DataContect 绑定,这样 Windows、Pages、UserControls 可以通过 ServiceLocator/Container动态附加到 ViewModels >等

在 UI 上渲染 ViewModel 的数据时,DataTemplates 与 Windows/Pages/UserControls 有何不同?除了这四种之外,还有其他类型的“视图”吗?

【问题讨论】:

    标签: .net wpf mvvm viewmodel datatemplate


    【解决方案1】:

    我使用它的方式,DataTemplate 实际上是把 View 链接到 ViewModel 的方式。通常我在 MVVM 中的 DataTemplates 看起来像这样:

    <DataTemplate DataType="{x:Type vm:FooViewModel}">
        <v:FooView />
    </DataTemplate>
    

    【讨论】:

    • 很有趣,但是您的 XAML 的其余部分看起来如何?我尝试了一个小例子,编译它,Visual Studio 说它需要管理员权限(Vista),奇怪。想看看您如何在项目中使用此模式。
    • 基本上,我将“映射”数据模板放在 App.xaml 或主窗口的 XAML 中,其他一切都是 UserControls...
    • 您是否使用 ContentControl 来拉入 ViewModel,我正在尝试使用像您这样的数据模板来执行此 但它没有将它们链接起来,它什么也不显示。
    • @Thomas,这真的很有帮助,它帮助我建立了我所追求的 MVVM 菜单模式,但是在这里导致了另一个问题,也许你也解决了这个问题:stackoverflow.com/questions/1026342/…
    • 是的,我通常使用 ContentControl 来显示 ViewModel。对于要使用的 DataTemplate,它必须可以从 ContentControl XAML 上下文中访问。
    【解决方案2】:

    在过渡到 MVVM 时,对我来说最有意义的是:

    UserControls:将视图和控件组合在一起,旨在为用户执行整个过程。我将用户控件用于我创建的滑出式抽屉,它允许用户翻阅不同分类的零件(其中每个主要零件类别都通过自己的选择过程/向导引导用户)。另请查看图表控件。

    视图:基本上是一个网格,它对相关数据和控件进行分组,在最小级别填充所需数据,以便可以重复使用。

    DataTemplates:对“项目”的事实进行分组,例如在列表框或 GridView 中。我认为这只是文本如何代表您试图在列表中获取信息的对象。因此,控制模板将包装数据模板块以控制该数据模板包装项目集合的显示行为。

    我是这么理解的,但是界限很模糊。我喜欢 Andrew Troelson 的 Apress 书籍 Pro Expression Blend 4。不过,他并没有真正给出任何数据量大的例子。

    【讨论】:

      【解决方案3】:

      我不建议使用 DataTemplate 将视图绑定到视图模型。 我目前在使用这种方法时遇到性能问题,因为每次视图获得焦点时都会刷新视图。 如您所见herehere

      不幸的是,我还没有找到更好的选择。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-14
        • 1970-01-01
        相关资源
        最近更新 更多