wpf - 对于 MVVM,viewmodel 将模型中的属性导出到 View 的最佳做法是什么?

标签 wpf design-patterns mvvm viewmodel

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

这是我的一个问题:

如何通过ViewModelmodel中的属性导出到View

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

这是我的实现之一:

    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; }
        }
    }

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

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

顺便说一句, 如果我们导出许多对象,例如 MyModel 对象的 List 以从 viewmodel 中查看,我该如何实现它以将 View 与模型解耦?

最佳答案

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

在您的 View /XAML 中,您有如下语句

... Content="{Binding myViewModelProperty}" ... 

取决于您要绑定(bind)的内容。

myViewModelProperty 必须是您的 ViewModel 中的公共(public)属性

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,是用模型中的数据创建的 显示在您的 View 中。您可以将 ViewModel 想象为 Adapter之间 你的模型和你的观点。

关于wpf - 对于 MVVM,viewmodel 将模型中的属性导出到 View 的最佳做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15801851/

相关文章:

asp.net - ASP.NET MVC 中的 NHibernate 事务管理 - 应该如何完成?

c++ - 此工厂功能有什么问题?

c# - 网络协议(protocol)的实现

c# - 使用 MVVM 模式时如何处理 MessageBox 对话框(MVVM Light ToolKit)

c# - WPF:DataGrid 查找和替换

c# - amCharts:帮助 WPF MVVM 数据绑定(bind)?

Mvvm 与 knockout : array binding and changing inner objects state

mvvm - Josh Smith 的 MVVM 演示应用程序 : Add commands to MainWindowViewModel's command list

c# - 当绑定(bind)属性的值未更改时,是否可以说服 PropertyChangedCallback 运行?

c# - 通过泛型类型参数访问属性