【问题标题】:Is this correct way to implement MVVM?这是实现 MVVM 的正确方法吗?
【发布时间】:2012-11-11 15:56:14
【问题描述】:

我正在创建一个应用程序,使用户能够插入、更新和删除已输入然后显示在数据网格中的数据(CRUD 操作)。

在我的视图模型中,它包含绑定到 xaml 的属性(例如Firstname)。它还包含一个导航属性以及验证属性。

      [Required(ErrorMessage = "First Name is a required field")]
      [RegularExpression(@"^[a-zA-Z''-'\s]{1,20}$", ErrorMessage = "First Name must       contain no more then 20 characters and contain no digits.")]
      public string FirstName
      {
        get { return _FirstName; }
        set
        {
            if (_FirstName == value)
                return;

            _FirstName = value;
            OnPropertyChanged("FirstName");
        }
    }

此外,它还包含用于执行xaml 的命令,从而创建CRUD 操作的实例;

    private void UpdateFormExecute()
    {
        var org = new OrganisationTypeDetail();
        UpdateOrganisationTypeDetail(org);
    }

最后,它还包含 CRUD 操作。比如插入、更新和删除。

这引出了我的问题。如果我想实现正确的 MVVM 方式,所有这些代码对于视图模型来说是否包含太多?

我是否应该使用该模型并在我的视图模型中创建一个集合并将其绑定到我的xaml?这会是正确的做法吗?

我应该为 CRUD 操作使用存储库系统吗?如果是这样,我将如何将文本字段中的数据传递给模型以进行更新?

我是 WPF、MVVM 的新手,如果没有适当的指导,我很难适应。

【问题讨论】:

    标签: c# wpf entity-framework mvvm datagrid


    【解决方案1】:

    我会说这是实现 MVVM 的一种正确方法,但不是实现 MVVM 的正确方法。

    我的意思是没有一个正确的方法来实现这个模式。如果您创建了一个可以绑定到您的 View 的 ViewModel,而您的 View 中没有任何额外的逻辑(即代码隐藏),那么您已经掌握了 MVVM 的精髓。

    是否在代码中添加更多模式和结构完全取决于您。如果这是一个简单的应用程序,我会保持模式简洁。继续,让您的 ViewModel 直接与存储库对话。在这方面,您当前的代码对我来说看起来还不错。

    如果这是一个大型应用程序,您可能需要添加更多层,例如服务层、数据访问层。您可能需要考虑依赖注入。

    但是不要仅仅因为你认为你应该采用一种模式,或者添加一个额外的层。依赖注入听起来很酷,但在许多情况下它比它的价值更麻烦!

    【讨论】:

    • 感谢您为我解惑,困惑是因为有这么多不同的方式,我只是不知道该遵循哪一个!另外,“依赖注入”是什么意思?
    【解决方案2】:

    对我来说这不是正确的方法,我认为在视图模型中定义像 FirstName 这样的属性不是一个好主意。视图应仅包含模型,并且您的视图模型应包装应绑定到 XAML 的模型(如果需要)。

    模型对象的创建也应该完全独立于视图模型。视图模型应该只知道模型上的单元操作,并且验证应该在模型内部,例如,在您的情况下,FirstName 验证在 ViewModel 中意味着您只限制 GUI 来验证 FirstName 属性,但是如果有人从其他地方设置它怎么办。

    【讨论】:

    • 谢谢。如果我想使用属性验证,我会把它放在哪里?在模型中?那么按照你的说法,将模型中的属性直接绑定到视图上?
    • 你能描述一下为什么这不是一个好主意吗?为什么它不是“正确的”MVVM?盲目地遵循关于如何实现模式的规则与根本不使用模式一样糟糕!
    • @coline 因为在解释的示例中,FirstName 似乎是模型的属性,我认为它应该在模型中而不是在视图模型中。
    • @D J,如果是这种情况,我将如何将 xaml 中的文本字段绑定到模型中的属性?另外,我还能在模型中使用属性验证吗?
    • @gregory.bmclub 您可以绑定模型的属性,例如<TextBlock Text="{Binding CustomerObject.FirstName}"/>,其中 CustomerObject 是在您的视图模型中引用的模型,并且对于验证,其中一种方法在@987654321 处显示@.
    猜你喜欢
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多