2

我想知道在视图模型中正确使用模型类的方法。作为 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

4 回答 4

5

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

于 2011-02-04T15:35:06.717 回答
5

我更喜欢第一种方法。有几个原因:

  • AModel永远不应该被 访问View
  • 理论上,aViewModel包装/外观需要绑定到Viewfrom的所有属性Model。它添加了促进View's 功能所需的任何其他属性、集合和命令,同时防止将代码放在代码后面。
  • IDataErrorInfoINotifyPropertyChanged方便View不行ViewModel。而既然View只是交流ViewModel,他们应该就在里面ViewModel
于 2011-02-04T15:46:29.430 回答
1

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

于 2011-02-05T15:35:04.683 回答
0

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

于 2011-02-04T18:12:18.187 回答