【发布时间】:2010-11-12 07:04:18
【问题描述】:
我听说它是构建 WPF UI 的下一个最佳选择,但所有现有的 示例有几十行代码 - 我可以得到一个 Hello World 对于 MVVM,它毫不含糊地解释了它的全部内容? 我对 C#/.net 也很陌生,所以也许可以指点我一些 也可以提供帮助的资源?
非常感谢!
【问题讨论】:
标签: wpf design-patterns mvvm user-interface
我听说它是构建 WPF UI 的下一个最佳选择,但所有现有的 示例有几十行代码 - 我可以得到一个 Hello World 对于 MVVM,它毫不含糊地解释了它的全部内容? 我对 C#/.net 也很陌生,所以也许可以指点我一些 也可以提供帮助的资源?
非常感谢!
【问题讨论】:
标签: wpf design-patterns mvvm user-interface
一句话解释:
MVVM 是对深受喜爱的 Model-View-Presenter (MVP) 模式的重新构想,该模式旨在与 WPF 提供的数据绑定工具一起工作,从而将应用程序逻辑与 UI 设计分离。
更长,更有用的解释:
MVVM 的基本概念是将 WPF 应用程序分解为单独的组件,每个组件在获取屏幕信息的过程中都有一个职责。
首先你有模型。这是一个功能非常有限的类,通常从一些外部资源(如数据库或 Web 服务)填充。例如:
public class MessageModel
{
public string Message { get; set; }
}
除此之外,您还可以对 ViewModel 进行分层,这是应用程序逻辑所在的位置,它通知视图模型的更改并确保数据一致性。通过实现 INotifyPropertyChanged 接口,WPF 免费提供了 ViewModel 和视图之间的两种数据绑定方式:
public class MessageViewModel : INotifyPropertyChanged
{
private MessageModel _model;
public string Message
{
get { return _model.Message; }
set
{
if (_model.Message != value)
{
_model.Message = value;
OnPropertyChanged("Message");
}
}
}
}
终于有了视图。这是一个 xaml 文件,描述了用于在 ViewModel 中显示和编辑数据的控件布局:
<Canvas>
<TextBox Text={"Binding Message"} />
</Canvas>
您进行所有这些工作的原因是模型非常轻量级,并且很容易跨域边界传递。从 Web 服务发送或接收数据或将其映射到数据库表很简单。另一方面,ViewModel 很复杂,但几乎没有依赖关系——它不关心模型从哪里获取数据,只关心它在那里并且根本没有视图的概念,这使得它非常可测试(您的应用程序的逻辑不依赖于 UI 进行测试)。最后,xaml 被很好地划分,可以交给不需要了解应用程序逻辑的设计人员,只需要 ViewModel 以特定名称呈现特定数据。这种封装使得在大型项目中定义角色变得非常容易,或者将有限的 UI 放在一起以测试逻辑,同时完善真实的逻辑。
【讨论】:
MVVM 是一种明星粉丝关系。粉丝认识明星,明星不认识粉丝。粉丝非常喜欢他的明星,如果明星改变自己(我是指他的穿衣风格),粉丝也会相应地改变自己。
现在将“star”替换为“ViewModel”,将“fan”替换为“View”并再次阅读。
【讨论】:
一句话?来了。
MVVM 是一种 UI 隔离模式,其中 Xaml(视图)绑定到外观(视图模型),允许您的程序(模型)的核心避免 UI 问题泄漏到层。
【讨论】:
最能帮助我理解它的简单语句是“我可以在没有用户界面的情况下对我的业务逻辑进行单元测试吗?”我认为这应该是您在使用 MVVM 概念学习和设计时提出的问题。
【讨论】:
This site 有一个很好的图表来解释它。
基本上你有 3 个组件:
1) Model - 应用程序的数据模型。这是非常标准的,与任何 MVP 或 MVC 应用程序相同。
2) View - 定义应用的视图/布局的 XAML。
3) View Model - 因为 WPF 要求视图以某种方式附加到事物上(比如要求集合实现 INotifyCollectionChanged 之类的东西),它通常需要您稍微按摩一下数据才能获得它以适合视图显示的形式。这是视图模型编码的地方。它将数据打包成视图可以轻松显示的视图模型。这是您的视图 XAML 将绑定到的内容。它必须响应来自模型层的事件并自行更新。
(然后您的控制器挂在某处 - 理想情况下使用 WPF 命令 - 并对模型进行更改,从而触发事件以更新视图模型)
【讨论】:
前端(视图)和后端(模态)使用公共中介(视图模态)进行通信(来回)的模式。
【讨论】:
MVVM 模式是当 UI 与一个对 xaml 友好的中间对象进行交互以获取对 xaml 不友好的实际数据时。
【讨论】:
我会这样说:“用户界面与其逻辑之间关注点分离的表示模式”
【讨论】:
改进的答案:
MVVM 是关于未来的;您希望将应用程序逻辑与框架分离,以便框架可以发展,您的应用程序可能不必更改,或者您的应用程序可以发展,您不必担心更改实际 UI 方面。
实际上,MVVM 是对已经存在了一段时间的模式的改进。我记得当我在 MFC 中工作时,我正在发展这种模式。这样做至少有两个原因。 MFC 或 相当复杂,将 MFC 结构与应用程序逻辑混合会使应用程序变得脆弱。示例:如果支持列表/选择器内容的逻辑与操作列表/选择器本身的逻辑相结合,则用组合框(或现代术语中的选择器)替换列表框要困难得多。
【讨论】:
已经有一些非常好的一句话(或接近它)的解释。我只是补充说,如果你已经超过了基本级别,并且你想要一个如何在具有菜单、工具栏、选项对话框、停靠工具窗口等的真实应用程序中使用 MVVM 的示例。 ,看看SoapBox Core 和这个demo using SoapBox Core。它是开源的,因此您可以获得很多想法。
【讨论】:
因为您无法将数据绑定到您自己的代码隐藏
(这里只是半开玩笑)
【讨论】: