MVVM Xamarin 表单设计

MVVM Xamarin Forms Design

所以我正在查看 https://github.com/xamarin/Sport 作为我在为我当前的项目进行谷歌搜索时遇到的一个例子。它与我的工作类似,因为我也使用 azure 后端。

我对他们的 mvvm 布局有疑问。我认为在 mvvm 中,模型是一种 POCO,不应该实现 INotifyPropertyChanged。在这种情况下,它们不是既充当模型又充当 ViewModel 吗?查看 Athlete 模型和 AthleteViewModel。 VM 有一个 属性 用于 Athlete,因此该模型也用作 VM。

在我的项目中,如果我有相同的类型,我会有一个 Athlete 模型、一个 AthleteViewModel 和一个 AthletePageViewModel。自动映射 Athlete 和 AthleteVM 的位置。填充和/或创建运动员的唯一原因是将其持久保存到服务或本地存储中。

一种方式比另一种方式 "correct" 多吗?还是我只是做错了并且使它复杂化了?我几乎不想继续我这样做的方式,因为如果我可以只使用我的一些 VM 作为模型,我不想有一堆 "extra" 模型文件。

谢谢。

为了实现 MVVM 设计模式,您无需遵循一套终极的严格规则。事实上,指南一般都相当模糊

据我所知,有几种不同的方法可以将模型暴露给视图。他们在这里:

方法 1 - 模型中的 INotifyPropertyChanged

public class Car : INotifyPropertyChanged
{
    private string _Model;

    public string Model
    {
        get { return _Model; }
        set 
        { 
            _Model = value;
            NotifyOfPropertyChange();
        }
    }

    ...
}

public class CarViewModel
{
    //The entire model is exposed to the view.
    public Car Model { get; set; }
    ...

方法 2 - 视图模型中的 INotifyPropertyChanged

public class CarViewModel
{
    private Car _Car;

    //The model property is exposed to the view, not the model itself.
    public string CarModel
    {
        get { return _Car.Model; }
        set 
        { 
            _Car.Model = value;
            NotifyOfPropertyChange();
        }
    }
    ...

首选方法而言,我认为方法 2 是更好的选择。为什么?

  • 模型对象没有暴露给视图。
  • View Model 仅公开 View 需要的内容。

方法 2 确实有其缺点。想象一下,如果您需要公开 lots 个模型属性,或者想象一下如果您的模型发生变化,那么简单地实现 INotifyPropertyChanged 肯定 更容易 在模型中并将其暴露给视图。程序员天性懒惰,为了省事,方法一和方法二一样多。

但这并不是一件坏事。

Is one way more "correct" than the other way? Or am I just doing it wrong and over complicating it?

记住,MVVM 设计模式只是一种模式。这两个选项都不正确,这主要取决于开发人员的偏好,他们选择如何实现模式,只要主要的 MVVM 概念存在,这就是最重要的。