WPF MVVM - 在视图模型类中使用模型

时间:2011-02-04 15:26:37

标签: wpf mvvm caliburn.micro

我想知道在视图模型中使用模型类的正确方法。作为MVVM,我使用Caliburn Micro。

第一种选择。

模特课:

    public class CurrentUser : IDataErrorInfo
    {
        public string Nick { get; set; }
        public string Password { get; set; }
//...
    }

在视图模型类中使用模型:

[Export(typeof(ILogOnViewModel))]
public class LogOnViewModel : Screen
{
    public CurrentUser CurrentUser { get; set; }

    //bind on control in view
    public string CurrentNick
    {
        get { return CurrentUser.Nick; }
        set
        {
            CurrentUser.Nick = value;
            NotifyOfPropertyChange(() => CurrentNick);
        }
    }

    //bind on control in view
    public string CurrentPassword
    {
        get { return CurrentUser.Password; }
        set
        {
            CurrentUser.Password = value;
            NotifyOfPropertyChange(() => CurrentPassword);
        }
    }
}

第二种选择:

模特课:

    public class CurrentUser : IDataErrorInfo, INotifyPropertyChanged
    {


        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }

        public string Nick
        {
            get { return _nick; }
            set
            {
                _nick = value;
                NotifyPropertyChanged("Nick");
            }
        }

        public string Password
        {
            get { return _password; }
            set
            {
                _password = value;
                NotifyPropertyChanged("Password");
            }
        }
//...
    }

在视图模型类中使用模型类:

[Export(typeof(ILogOnViewModel))]
public class LogOnViewModel : Screen
{
    //bind on UI control
    public CurrentUser CurrentUser { get; set; }
}

4 个答案:

答案 0 :(得分:5)

第一种选择会更好,因为它可以更好地从View中封装你的模型 但是您应该在 ViewModel 上实现IDataErrorInfoINotifyPropertyChanged,因为ViewModel应该是通知您的用户界面更改和错误的对象。

答案 1 :(得分:5)

我更喜欢第一种方法。原因如下:

  • Model永远无法访问View
  • 从理论上讲,ViewModel包装/展示了从View绑定到Model所需的所有属性。它添加了促进View功能所需的任何其他属性,集合和命令,同时防止将代码放入代码中。
  • IDataErrorInfoINotifyPropertyChanged便于View而非ViewModel。由于View仅与ViewModel进行通信,因此它们应位于ViewModel内。

答案 2 :(得分:1)

我会使用第二方法。如果您正在寻找使用第二种方法的示例应用程序,那么您可能会发现 WPF Application Framework (WAF) 项目很有趣。

答案 3 :(得分:0)

我建议从第二种方法开始。它可以避免输入大量重复的桥接属性。如果遇到需要包装在View Model上的属性,则对该属性执行此操作,然后更新View的绑定。您的模型和视图模型都可以实现IDataErrorInfo和INotifyPropertyChanged。当模型中的某些逻辑更改属性时,后者非常有用,因为它将传播到View。通过基类实现这些接口,你可以同时拥有ModelBase和ViewModelBase抽象类,后者来自前者。