【问题标题】:Silverlight MVVM: MainView w/ SubViews OR MainViewModel w/SubViewModelsSilverlight MVVM:带子视图的主视图或带子视图模型的主视图模型
【发布时间】:2011-04-13 14:50:00
【问题描述】:

我有一个带有选项卡式 UI 的 MainView。

如何向 TabControl 添加新的 TabItem(= View)? 基本上我看到了两种方式:

1.)
* 从 MainView 中的代码我可以添加一个新选项卡。
* 新选项卡包含一个带有对其视图模型的引用的视图。

2.)
* 从 MainViewModel 中的代码,我可以将新视图模型添加到子视图模型列表
* mainView的tabcontrol绑定到那个列表

我更喜欢案例 #1,因为我认为视图应该知道并实例化它的 VM(可能通过使用 MVVM 灯 ViewModelLocator),而不是相反。
但是我怎样才能从新创建的 VM 引用到 MainVM?例如:MainVM 有一个属性“IsAdmin”;如何从 SubViewModel 访问(绑定)该属性?

备选方案#2:TabControl 如何知道应该为不同的 ViewModel“渲染”哪个视图?如何从 SubViewModels“映射”到相应的“SubViews”?

感谢您分享您的想法!

【问题讨论】:

  • 视图的性质是什么? (它们是否相同),它们是如何添加的?
  • 观点可能大不相同。像实体(产品、客户)的可视化以及文档的预览等。目前,我从周围 MainView 的代码隐藏方法中添加它们,并让 TabControl 本身处理关闭和删除选项卡,效果很好。但我确实相信,这不是最好的方法,“标签控制”应该去别的地方......

标签: silverlight architecture mvvm mvvm-light


【解决方案1】:

我会check out this SO post,因为答案可以用来帮助您解决问题。

本着 MVVM 的精神,您需要遵循备选方案 #2。让您的 ViewModel 逻辑帮助您确定需要显示哪些“选项卡”,并使用 DataTemplates 来表示这些对象。然后您将它们绑定到 View 的 DataContext 并且您在 DataTemplate (View) 中的绑定将正常工作。

【讨论】:

  • 感谢您的回答。我会试试看的!
  • 也许 Silverlight 5 的“隐式 DataTemplates”会是一个很好的解决方案?拥有一组 ViewModel。将其绑定到 TabControl。让 Silverlight 5 决定如何通过为每个 ViewModel 使用隐式 DataTemplate 来呈现它。所以“控制”部分将在 SL5 中开箱即用。
  • WPF 已经能够将 DataTemplate 与 ViewModel 关联起来,这样当 WPF 在绑定中遇到 ViewModel 时,它会找到合适的视图来呈现该 ViewModel。您可以在 Silverlight 中使用绑定上的 DataTemplateSelector Converter 实现相同的目的。与 WPF 相比,它有点笨拙,但仍然可行。
【解决方案2】:

托马斯,

MVVM 真的是 MVVMC。我建议为 MainView 设置一个控制器,其中包含创建新选项卡的方法。如果 TabControl 很复杂,您可以将功能放在 TabControl 本身中。

当驱动功能位于模型中时,关注点分离(MODEL 与 VIEWMODEL 与 VIEW 与 CONTROLLER)会受到影响。 (M 或 VM)。

问候,

圭多

【讨论】:

  • 好点!事实上,我确实有这种“控制器”,但目前它直接位于 MainView 的代码隐藏中。我可以轻松地重构它。但是......这与戴夫怀特的建议相反(见下文)。我也越来越觉得,“控制部分”应该更多地与 MainViewModel 联系起来,而不是与 MainView 联系起来。嗯...
  • MVVM 模式与 MVP 模式的关系更为密切。通常,MVVM 被描述为 MVP 的专用 WPF 版本。在 MVVM 中,ViewModel 被认为以控制器方式运行。我还没有在 MVVM 实现中看到实际的 Controller 类。
  • @Dave:很有趣。我倾向于将 MVP 视为 MVC 的“方言”。我很乐意向您展示我构建的一个数据非常丰富的 WPF 客户端的源代码,该客户端具有运行该节目的 MVVMC 模式的控制器。不幸的是,它是平息的。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 2018-03-17
  • 2010-12-07
相关资源
最近更新 更多