【问题标题】:Question about ViewModel Management (DesignTime Vs Run Time)关于 ViewModel 管理的问题(设计时与运行时)
【发布时间】:2011-07-14 15:55:21
【问题描述】:

我有一个相当基本的 WPF UI,用户请求会导致在我的 TabControl 中打开一个新选项卡。 TabControl 绑定到 ObservableCollection<ViewModelBase>

我将 ViewModel 实例添加到这个集合中,相应的选项卡的内容会基于这样的模板显示:

    <DataTemplate DataType="{x:Type viewModels:UserUploadsViewModel}">
        <userControls:UserUploads />
    </DataTemplate>

现在假设在 UserUploads 控件内部,我想在 XAML 中连接一个 ViewModel 以帮助进行设计,如下所示:

<UserControl x:Class=".....UserUploads"
   .....
    DataContext="{Binding Source={StaticResource ViewModelLocater},
                  Path=UserAdministrationViewModel}">

此属性将在运行时返回一个带有实时服务的 ViewModel,并在设计时返回一个带有模拟数据的 ViewModel。

问题:此 XAML 是否会干扰我将 TabItems 内容绑定到 ViewModel 实例并依赖上面的 dataTemplate 呈现正确视图的操作?如果是这样,有没有办法让这两个概念一起工作?

【问题讨论】:

    标签: c# wpf xaml mvvm


    【解决方案1】:

    有一种更简单的方法可以做到这一点。有一个DesignTimeUserAdministrationViewModel 并在构造函数中用静态数据填充它,并在UserControl 中将其引用为:

    <UserControl d:DataContext="{d:DesignInstance designTimeVMs:DesignTimeUserAdministrationViewModel, IsDesignTimeCreatable=True}">
    

    这样您就有了一个绑定到d:DataContext 的设计时测试数据和绑定到实际DataContext 的运行时实时数据。更多详情here.

    【讨论】:

    • 看起来不错。所以如果是设计时,那个(设计时视图模型)对象将被连接起来,但在运行时它什么都不做?
    • 是的,它是为了混合而添加的。
    • 太棒了!使用IsDesignTimeCreatable=True 将使用数据填充视图。如果设置为False,它只会提供数据的“形状”,在设计器中提供完整的数据绑定支持,而不是盲目绑定。此外,您可以使用 .xaml 文件通过 {d:DesignData} 完全指定示例数据。见Walkthrough: Using a DesignInstance to Bind to Data in the DesignerWalkthrough: Using Sample Data in the WPF Designer
    • 这个解决方案超级棒!
    • 您的链接已失效 - 您删除了您的 WordPress 网站
    【解决方案2】:

    是的,我认为它会干扰您当前的设置

    ViewModelLocator 是一个静态类,它在设计时返回一个虚拟对象,在运行时返回一个静态 ViewModel。这意味着

    • ViewModelLocator,而不是您的 ParentViewModel,包含您的 TabViewModels

    • 您不能同时打开同一个选项卡 (ViewModel) 的多个实例

    • 除非引用 UserControl,否则无法管理打开/关闭选项卡,这违反了 MVVM 原则,即 ViewModel 不知道 View

    • 您无法使用参数化构造函数实例化 TabViewModel 的新副本。例如,OpenTabs.Add(new CustomerViewModel(CustomerId));

    也许另一种选择是转换器?如果在设计时返回静态对象,或者在运行时返回绑定对象?我从来没有测试过这样的东西,但理论上它应该可以工作:)

    【讨论】:

      【解决方案3】:

      内置的 MS 东西还不错,但我正忙于将另一个更优雅且结构合理的替代方案整合到我的项目中是: http://msdn.microsoft.com/en-us/magazine/dn169081.aspx

      基本上,您将 MVVM Light 工具包与它附带的 SimpleIoc 容器一起使用,最终能够为以下三个场景提供数据:

      设计时间、运行时间和测试时间。

      更好的是,MVVM Light 的全部意义在于让您的内容可以在 Blend 中直接编辑,并且有一系列视频、博客和示例应用程序来描述这一切。我希望我早先在 WPF 探索中发现了这些。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-11
        • 1970-01-01
        • 2012-04-09
        相关资源
        最近更新 更多