【问题标题】:How to implement models and viewmodels correctly in a MVVM pattern如何在 MVVM 模式中正确实现模型和视图模型
【发布时间】:2014-05-27 18:16:18
【问题描述】:

我已经开始学习 MVVM 模式并面临一些问题。我正在构建一个存储某个国家/地区的省市列表的应用程序。现在我需要知道我应该如何准确地实现模型。

应该说数据库中的表及其字段如下:

表:省份: 身份证、姓名

表格:城市 ID、省ID、名称

现在我想知道哪种方法更适合模型?模型的属性是否应该与表中的字段完全相同?例如:

class Province {

public uint ID {get; set;}
public string Name {get; set;}

};

class City {
    public uint ID {get; set;}
    public uint ProvinceID {get; set;}
    public string Name {get; set;}

}

还是让类 City 引用其省会更好,例如:

class City {
    public uint ID {get; set;}
    public Province Province {get; set;}
    public string Name {get; set;}

}

或者有什么更好的想法?

视图模型呢?我应该在 ProvinceViewModel 中列出 CityViewModel 吗?

提前致谢。如果我没有清楚地解释我的问题,请告诉我。

【问题讨论】:

  • 我想说你需要对 MVVM 模型有更多的了解。我会看看这篇文章,它推荐了一些很好的资源。您可以通过示例找到答案。 stackoverflow.com/questions/1405739/…

标签: c# wpf mvvm model viewmodel


【解决方案1】:

如果您可以将实际的 Province 作为您的班级成员,为什么还要使用特定 Province 的 ID?

假设您需要省份名称,因此您需要首先定位并构造Province 以获得实际名称。话虽如此,根本没有必要。

基本上你有一个 MVVM 模式的Model、一个ViewModel 和一个ViewViewViewModel 交互,反之亦然。另外,ViewModel 使用Model 来进行更改。

您可以将两个类都用作Model,同时为每个类使用ViewModelProvinceViewModel 可以构造如下:

class ProvinceViewModel : INotifyPropertyChanged
{
    private Province _Province;

    public string Name
    {
        get { return _Province.Name; }
        set
        {
            if (_Name == value) return;
            _Province.Name = value;
            OnPropertyChanged("Name");
        }
    }

    public ProvinceViewModel(Province province)
    {
        _Province = province;
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

注意INotifyPropertyChanged的实现。你现在可能会问我为什么要实现它。为了更新您的View,您需要此界面来发布任何消息并通知您的View,您的Model 中的某些内容已更改。

使用Caliburn.Micro 之类的框架怎么样?当然,这会保护你的大量工作,并且一旦你投入其中,就会感觉非常舒服。

【讨论】:

  • 我们不能在ProvinceViewModel 中只有一个Province 成员而不是Province 模型本身的每个成员吗?实际上,我在教程中看到一个省成员位于 ViewModel 中,称为 CurrentProvince 或 SelectedProvince。哪种方式更正确?
  • 为了通知视图你的模型的一个成员已经更新,你需要以这种方式实现每个成员。这需要不断更新您的视图,而无需手动执行此操作。你可以随意命名,但我猜它们被称为 CurrentSelected,因为它们实际上代表控件的当前或选定项,例如 DataGrids 或 SplitButtons。
  • 我明白,但模型为什么不继承 INotifyPropertyChanged?
猜你喜欢
  • 2015-06-14
  • 1970-01-01
  • 2011-07-14
  • 2015-08-24
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多