【问题标题】:Wpf Command Binding to ViewModel or Model?Wpf 命令绑定到 ViewModel 或模型?
【发布时间】:2017-10-11 13:56:17
【问题描述】:

我有几个模型和一个 TreeView 来显示它们。 HierarchicalDataTemplate 使用 ItemsSource 显示模型。 领口轮廓...

public class ModelA : ObservableBase
{
  private string _name = "A";
  private Observablecollection<ModelB>_bModels = new Observablecollection<ModelB>();

  String Name {
    get {return _name;}
    set { _name = value; OnPropertyChanged("Name"}}
  Observablecollection<ModelB>BModels {
    get {retun __bModels; }
    set {_bModels = value; OnPropertyChanged("BModels"}}
}

ModelB is similar.

现在 TreeView 可以正确显示数据,并且我已将 ContextMenus 添加到每个级别。最初在 HierarchicalData 中的 TextBlock.ContextMenu 上,但现在作为 TreeView.Resource 中的资源。

命令现在在每个模型中调用 CommandProperties,如果这是应该完成的方式,但它确实有一个命令存在问题,需要从另一个模型或 ViewModel 调用 CommandProperty。 我已将它设置为 ViewModel 并且它可以工作,但我现在到处都有命令。

因此问题是命令应该去哪里?在它们所属的模型和/或视图模型中?

命令是“添加 A”、“删除 A”、“添加 B”、“删除 B”

Root- Add A
A- Add B/Remove A (this)
  B- Remove B
  B- Remove B
A- Add B/Remove A (this)
  B- Remove B

如果需要,我会显示更多代码,但会占用大量空间,希望您能从中理解概念和问题。

【问题讨论】:

    标签: wpf xaml mvvm treeview


    【解决方案1】:

    基本上所有的绑定都应该在 View 和 ViewModel 之间解析。 Model 应该只是用来为 ViewModel 提供数据,它应该从 ViewModel 中暴露出来,以便通过绑定显示出来。

    MVVM 应用程序的结构应该大致如下:

    • 模型 - 存储数据(可能实现了一些基本的数据操作,例如计算)
    • ViewModel - 实现了视图对数据所做的所有操作。例如,如果您从 DataGrid 中删除行,您的 ViewModel 应该有一个命令,该命令从模型或应用程序的某个附加层实现对方法的调用,这将执行所需的操作(但 ViewModel 不应该对数据本身进行操作) . ViewModel 还应该从 Model 获取数据并将其公开为与 View 绑定的属性,以便显示数据。
    • 查看 - 提供用户界面以允许用户执行操作。除了与显示相关的内容(即使在代码后面)之外,它不应执行任何操作。例如,在代码后面绑定数据的事件应该被禁止遵循 MVVM 模式,但是当按钮被点击时切换按钮颜色的动作可以在代码后面或 ViewModel 中完成(取决于个人喜好),因为它只是 View相关。
    • 数据操作层 - 使用附加层来管理在模型上执行的数据操作是很常见但可选的。

    【讨论】:

    • 我可以理解这一点,但我观看了一段视频,有人解释说,如果您所做的只是通过 ViewModel 的访问器公开数据,那么不要打扰 ViewModel,只需从 Model 中执行即可.此外,分层数据结构在树视图上的工作方式不适合在不复制整个模型结构的情况下使用视图模型。
    • 您在视频中看到的信息没有错。但这取决于情况。设计模式的存在是为了让您的生活更轻松(也让与您一起工作的其他人更轻松),如果由于某种原因它不能让事情变得更轻松,那就改变它或走一条不同的路线。如果您必须将代码增加三倍才能使视图模型正常工作,那么您似乎可能想要修复设计中的某些问题。
    • 泛型和反射也可以成为您通过 ViewModel 公开模型时的朋友。
    • 我描述的是原始形式的纯 MVVM 结构。有许多“代码向导”会说这个或那个可以更容易或以不同的方式完成。他们大多是正确的,但对我来说,如果你决定使用设计模式,你应该坚持下去。否则首先使用它的原因是什么?
    • 正如 Ginger Ninja 所说,一切都取决于情况,取决于项目和团队规模。如果这是一个单独的项目,您可以做任何您想做的事情,因为您有责任处理该代码并维护它。如果这是一个由 +3 开发人员组成的大型项目,我建议严格遵守您决定实施的设计模式,因为您最终可能会遇到团队会责备您走捷径的情况。
    猜你喜欢
    • 2012-02-23
    • 1970-01-01
    • 2015-07-04
    • 2011-01-23
    • 2011-06-21
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多