如何实现MVVM与WPF树视图

本文关键字:WPF 视图 MVVM 何实现 实现 | 更新日期: 2023-09-27 18:01:22

我以前没有使用过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元素相关,该类的对象将绑定到UI元素。
在这种情况下,视图模型类应该具有树视图的isExpanded和isSelected属性。
然后,我需要另一个视图模型类为整个树视图,它将包含目录和文件的集合,应该显示。

我的问题是:

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

如何实现MVVM与WPF树视图

答案1)是。

答案2)视图模型应该有iNotifyPropertyChanged

回答3)是。它们应该被显式地映射。例如:

   this.property1 = model.property1

答案4)使用相同的名称,见答案3。

如果您在视图模型中使用私有-公共属性对,在视图模型中使用iNotifyPropertyChanged,并将模型的属性映射到视图模型中相应的属性,您应该设置。

模型也可以实现iNotifyPropertyChanged,你不需要在视图模型中重复属性。

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

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