Wpf MVVM设计视图模型的最佳实践

时间:2013-12-28 07:25:42

标签: wpf mvvm

我正在使用WPF,目前正在为我的viewmodels设计getter / setter。我的问题是,一旦用户更改(通过setter),我应该将更改应用于模型吗?还是应该仅在调用Save()方法时将更改复制到模型?例如:

模型

public class Customer {
    string Name { get; set; }
    int Age { get; set; }
}

视图模型

public class CustomerVM {

    //getters and setters are bound to the model.
    public string Name {
        get 
        {
            return model.Name;
        }
        set {
            model.Name = value;
        }
    }

    public int Age {
        get {
            return model.Age;
        }
        set {
            model.Age = value;
        }
    }

    public Customer model { get; set; }

    public CustomerVM(Customer model) {
        SetModel(model);
    }

    private void SetModel(Customer model) {
        this.model = model;
    }

    public void Save() {
        CustomerService.Update(model);
    }

}

是首选..

public class CustomerVM {

    string name;
    public string Name {
        get 
        {
            return name;
        }
        set {
            name = value;
        }
    }

    int age;
    public int Age {
        get {
            return age;
        }
        set {
            age = value;
        }
    }

    public Customer model { get; set; }


    public CustomerVM(Customer model) {
        SetModel(model);
    }

    private void SetModel(Customer model) {
        //values are copied over to VM when upon initialization
        this.model = model;
        this.name = model.Name;
        this.age = model.Age;
    }

    public void Save() {
        //values are copied to the model when user saves
        model.Name = name;
        model.Age = age;
        CustomerService.Update(model);
    }

}

1 个答案:

答案 0 :(得分:2)

从最终用户的角度来看,两者的功能完全相同,即在调用Save方法时将保存数据。如果这是您的应用程序的正确行为,您应该使用最简单的实现,这是第一个。

如果您想添加“撤消”功能,即允许用户将属性值重置为当前模型值,我可以看到第二种实现很有用。

无论如何,我通常从一个视图模型开始,该模型适应模型值,直到我需要一些矿石复杂。