Wpf命令绑定到ViewModel或Model?

时间:2017-10-11 13:56:17

标签: wpf xaml mvvm treeview

我有几个模型和一个TreeView来显示它们。 HierarchicalDataTemplate使用ItemsSource显示模型。 Ruff outline ...

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并且它可以工作但我现在可以在整个地方使用命令。

问题是命令应该去哪里?在模型中它们属于和/或在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

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

1 个答案:

答案 0 :(得分:1)

基本上所有绑定都应在View和ViewModel之间解析。模型应该仅用于为ViewModel提供数据,从中公开它以便View通过绑定显示。

MVVM应用程序的结构应该或多或少看起来像这样:

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