对于MVVM,viewmodel在模型中导出属性以查看的最佳做法是什么?

时间:2013-04-04 03:07:14

标签: wpf design-patterns mvvm viewmodel

作为WPF的新手,我最近开始了我的MVVM旅行。我可以理解为什么我们需要MVVM的原始内涵,但是一些实现细节仍然让我很困惑。

以下是我的一个问题:

如何通过model

View中的媒体资源导出到ViewModel

我可以在这里展示我的一些想法,所以请与我分享您的观点。

以下是我的实施之一:

    class MyModel : INotifyPropertyChanged
    {
        private String _name;
        public String Name
        {
            get { return _name; }
            set 
            {
                if (_name != value)
                {
                    _name = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("Name"));
                    }
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

    class MyViewModel
    {
        private MyModel _model;

        public MyModel Model
        {
            get { return _model; }
            set { _model = value; }
        }
    }

我认为问题在于我们不会将视图与模型分离。并且视图需要知道有关模型实现的每个细节以完成绑定过程。在Model 直接中导出属性以从ViewModel查看,在我看来不能被视为一个好的设计。

所以我希望你能分享一下你对这个主题的设计经验。

顺便说一句, 如果我们从viewmodel导出许多对象(例如List MyModel个对象,那么我如何实现它以将视图与模型分离?

3 个答案:

答案 0 :(得分:4)

不是您的模型,但您的ViewModel应实现INotifyPropertyChanged。然后,您可以在视图中使用Binding从ViewModel获取数据。

在您的View / XAML中,您有

之类的陈述
... Content="{Binding myViewModelProperty}" ... 

取决于你的约束力。

myViewModelProperty必须是ViewModel中的公共属性

public string myViewModelProperty { get; set; }

不要忘记在setter中调用RaiseNotifyPropertyChanged(或调用你的处理程序)来获取View中的更新。

private string myViewModelField;

public string myViewModelProperty 
{ 
   get
   {
        return myViewModelField;
   }
   set
   {
       myViewModelField = value;
       RaiseNotifyPropertyChanged(() => myViewModelProperty);
   }
}

**更新**

列表通常通过ObservableCollection<Type>“导出”。 理想情况下,Type是一些ViewModel,使用模型中的数据创建 显示在您的视图中。您可以将ViewModel想象为Adapter之间 你的模特和你的观点。

答案 1 :(得分:1)

这不是一个严格的规则,但在我的情况下,我更喜欢在ViewModel中实现INotifyPropertyChanged并将模型保留为简单的POCO。

在ViewModel中“重复”模型的属性可能很烦人,但是:

  1. 通常,您不需要将所有属性公开给View。
  2. 它允许您在VM中添加其他代码,例如用户输入验证,并保持模型“干净”。
  3. 所以在你的例子中它将是:

       class MyModel
        {
            public String Name
            {
                get;
                set;
            }     
        }
    
        class MyViewModel : ViewModelBase //let's say you have this base class in your framework
        {
            private MyModel model;
    
            public MyViewModel(MyModel model)
            {
                this.model = model;
            }
    
            public string Name 
            {
                get
                {
                     return this.model.Name;
                }
    
                set
                {
                     if(IsValidInput(value)
                     {
                         this.model.Name = value;
                         this.RaisePropertyChanged("Name"); // the ViewModelBase  base class provide this helper.
                     }
                }       
            }    
        }
    

    关于第二个问题,ObservableCollection通常是向视图公开模型集合的好方法:

    class ContactListViewModel
    {
        public ObservableCollection<MyModel> Contacts { get; private set;}
    }
    

答案 2 :(得分:0)

您只需在视图wiuth Model.Name

上绑定您的属性即可