【问题标题】:How to implement MVVM with the WPF treeview?如何使用 WPF 树视图实现 MVVM?
【发布时间】:2016-08-08 14:25:09
【问题描述】:

我之前没有使用过 WPF 或 MVVM 模式。
但是,我想创建一个简单的文档管理系统,并希望使用上述技术来实现。

我已经在我的数据库中建模了一个分层文件系统,并希望在树视图中显示它。
EER-Diagramm
如您所见,每个目录可以有多个子目录和多个文件。

我已经阅读了一些关于该主题的教程,如果我理解正确,那么我应该为直接存储数据库数据的目录和文件创建模型类。
示例:

public class Directory
{
    private int id;
    public int Id
    {
        get { return id; }
        set { id = value; }
    }

    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    private int parent;
    public int Parent
    {
        get { return parent; }
        set { parent = value; }
    }

    private DateTime dateCreatedOn;
    public DateTime DateCreatedOn
    {
        get { return dateCreatedOn; }
        set { dateCreatedOn = value; }
    }
}

然后每个模型类都应该有一个关联的视图模型类,它实现了仅与描述此类对象将绑定到的 UI 元素相关的附加属性。
在这种情况下,视图模型类应该具有树视图项的 isExpanded 和 isSelected 属性。
然后我需要另一个视图模型类用于整个树视图,其中包含应该显示的目录和文件的集合。

我的问题是:

  1. 我是否正确理解了 mvvm 概念?
  2. 目录的哪个类(模型或视图模型)应该实现 iNotifyPropertyChanged 接口?
  3. 目录的视图模型类是否应该包含与模型类相同的属性,或者对视图模型类中模型对象的引用是否足够?
  4. 如果视图模型类应该再次包含模型类的相同属性,那么确保模型对象和关联的视图模型对象始终保持同步的最佳方法是什么?

我希望这个问题是可以理解的,并感谢所有帮助。 安达哈里

【问题讨论】:

  • 问题 2-4 之前肯定已经单独提出过。
  • 分层数据模板

标签: c# wpf mvvm treeview


【解决方案1】:

回答 1) 是的。

回答 2) 视图模型应该有 iNotifyPropertyChanged。

回答 3) 是的。并且它们应该被显式映射。即:

   this.property1 = model.property1

答案 4) 使用相同的名称,请参阅答案 3。

如果你在view-model中使用private-public属性对,在view-Model中使用iNotifyPropertyChanged,并将model的属性映射到view-model中对应的属性,你应该进行设置。

【讨论】:

    【解决方案2】:

    Model也可以实现iNotifyPropertyChanged,不需要再重复View Model中的属性。

    https://msdn.microsoft.com/en-us/library/gg405484(PandP.40).aspx

    “模型还可以通过 IDataErrorInfo(或 INotifyDataErrorInfo)接口支持数据验证和错误报告。IDataErrorInfo 和 INotifyDataErrorInfo 接口允许在值更改时通知 WPF 数据绑定,以便更新 UI。它们还支持用于 UI 层中的数据验证和错误报告。”

    【讨论】:

      猜你喜欢
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多