3

我不知道这个问题是否属于这里并告诉我是否不属于,但我在 WPF 和 MVVM 上苦苦挣扎。

所以现在我有一个类 Customer 大约有 20 个属性:

public class Customer 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    ...
}

例如,根据 MVVM,我必须在我的 ViewModel 中复制所有这些属性(我只添加了 name 属性以使问题不会太长。但考虑到我会将我的 Model 的所有 20 个属性添加到我的 ViewModel 中,如下所示):

public class CustomerViewModel : ViewModelBase
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            OnPropertyChanged();
        }
    }
    ...
}

因此,您已经可以看到,仅通过该示例,我就创建了数百行代码。现在如果我需要将视图的数据保存到数据库中,我会这样做:

private void SaveCustomer()
{
    Customer customer = new Customer();
    customer.Id = Id;
    customer.Name = Name;
    customer.Address = Address;
    ...
}

又是一大堆代码。如果我需要加载客户,我需要做同样的事情,如果我需要清空所有属性,我需要设置每个属性 = null。

在我的项目中,我完全这样做了,我不知道这是否正确,如果有,请告诉我另一种方式。但这会创建数百行代码,我看不出这是如何维护的,因为使用这么多代码很容易丢失跟踪。请告诉我是否有其他方法,或者我的想法是否错误。

4

2 回答 2

1

将属性包装Model在您的ViewModel属性上,使属性彼此隔离。

public class Customer 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    ...
}
public class CustomerViewModel : ViewModelBase
{
    private Customer _customer;
    public string Name
    {
        get => _customer.Name;
        set
        {
            if(_customer.Name != value)
            {
                 _customer.Name = value;
                 OnPropertyChanged();
            }
        }
    }
}

然后你可以省略SaveandLoad方法或者直接调用Repository.Save / Load它们。这个想法是,每个属性都可以单独测试。

于 2018-06-16T16:13:24.837 回答
1

没有任何规则说您的模型 POCO 和视图模型 POCO 必须不同。我会使用Customer,并拥有一个视图模型:

public class CustomerPageViewModel
{
     public Customer Customer
     {
         //get/set
     }
}

这样,来自 UI 的任何更改都已经在该对象中,您可以将其传递给任何将保留更改的服务。Customer 可以实现 INPC,但如果只有 UI 正在更改它,那就没有必要了。

作为旁白; 不要用长度来衡量你的代码质量,有时你只是在虚拟机上有很多属性。根据维护、扩展等方面的难易程度来衡量它。

于 2018-06-19T17:33:34.637 回答