对于 MVVM,viewmodel 导出模型中的属性进行查看的最佳实践是什么?

win*_*TTr 3 wpf design-patterns mvvm viewmodel

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

这是我的问题之一:

我应该如何将属性导出modelViewviaViewModel

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

这是我的实现之一:

    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; }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

所以我希望你能分享你关于这个话题的设计经验。

顺便说一句,如果我们导出许多对象,例如从视图模型中查看ListMyModel对象,我该如何实现以将视图与模型解耦?

Mar*_*tus 5

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

在您的视图/XAML 中,您有类似的语句

... Content="{Binding myViewModelProperty}" ... 
Run Code Online (Sandbox Code Playgroud)

取决于您要绑定的内容。

myViewModelProperty 必须是 ViewModel 中的公共属性

public string myViewModelProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

不要忘记在 setter 中调用 RaiseNotifyPropertyChanged(或调用的处理程序)以获取视图中的更新。

private string myViewModelField;

public string myViewModelProperty 
{ 
   get
   {
        return myViewModelField;
   }
   set
   {
       myViewModelField = value;
       RaiseNotifyPropertyChanged(() => myViewModelProperty);
   }
}
Run Code Online (Sandbox Code Playgroud)

** 更新 **

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