需要有关在WPF中实现UI的建议

时间:2009-09-09 02:46:49

标签: wpf design-patterns mvvm user-interface mvp

我需要一些关于在WPF中实现UI的建议。

到目前为止,我一直在使用Code-Behinds,它非常容易上手,但在维护/更改/测试时却很糟糕。

我看过MVP(以及它的WPF变种 - MVVM),但是在开始时遇到了一些麻烦。

假设我有一个用于构建的UI,这就是我想的我应该做的事情:

1。 创建一个“主UI”Mediator类,它指定我的UI支持的所有高级操作(LoadSettings(),SetVisibility())和事件(不是由用户触发,例如,模型数据已更改)。

2。 创建“模型”类来表示数据

3。 为我的模型类创建“ViewModel”类。

4。 对于复杂的行为(例如,需要在UI可以/应该更新之前完成一系列操作,例如修改集合中的项),不要依赖ViewModel来更新UI。而是通过Main UI Mediator类手动完成。

5。 对于简单的行为(例如,切换可见性/启用状态/等),使用WPF绑定将ViewModels的属性直接绑定到UI。

在这种情况下,Main UI Mediator类将维护ViewModel和Model对象,并适当地委托用户交互(对Model)和UI更新请求(对ViewModel / View)。 Mediator类还提供了一个集中的界面,用于指定UI的功能,同时充当变更管理器(在GOF的观察者模式中描述)来处理复杂的UI行为/减少冗余的UI更新。

我是否在正确的轨道上?我应该调整我的方法吗?完全改变它?目前,我缺乏实施庞大/复杂UI的经验/知识,因此我不知道自己是否走在正确的轨道上。

由于

2 个答案:

答案 0 :(得分:4)

这有点长,抱歉!

  

到目前为止,我一直在使用Code-Behinds,它非常容易上手,但在维护/更改/测试时却很糟糕。

是的:)任何时候你必须命名一个控件并在你的代码隐藏中写下“someControl dot blah”,那就是代码味道。它有时是不可避免的,但尽可能地限制它。您的用户界面是模型投影 - ViewModels和ValueConverters是一种处理两个域之间阻抗不匹配的方法。

您的方法存在一些问题:

  

创建一个“主UI”Mediator类,它指定所有高级操作

而不是这样做,你的Window类充当“控制器”;重要的是,使用指挥来定义您的顶级操作。这样,您可以将UserControl与Window类分离,因为UserControl只调用Commands.Open.Execute(null,this),而Window可以处理它,而UserControl永远不会明确地依赖Window。

  

为我的模型类创建“ViewModel”类。

在MVVM中,VM部分是为了帮助 - 如果你可以直接绑定到模型(即数据没有改变,或者你不介意实现INotifyPropertyChanged in你的模型),然后这样做(即使你必须使用一些IValueConverter类)是好的。 ViewModel主要用于视图所以与模型表示不同的时候,它很难破解你的模型,或者“粘贴”只在这个特定视图中有意义的额外属性。

  

担任变更经理时......

请记住,WPF通过依赖属性和INotifyPropertyChanged为您完成此操作;不要重新发明轮子;如果你编写一个OnDataUpdate()函数,这是一个你没有正确使用数据绑定的标志。

  

例如,需要在UI可以/应该更新之前完成一系列操作,例如修改集合中的项目

命令很棒 - 您的 CanExecute 函数可以应用任意复杂的逻辑来决定是否可以执行某项操作,以及是否将其绑定到UI元素如菜单或按钮,它们将根据需要自动禁用/启用。

答案 1 :(得分:1)

没有提及,但是在XAML中完成了所有的UI设计。

没有什么比通过代码隐藏创建WPF UI更糟糕了。