我已经使用WPF和Xaml一段时间并且非常喜欢它。但是,我可能还在设计一些东西,就像我在WinForm时代那样,在GUI部分有太多的代码和责任。
Anways,在WPF模型中究竟是什么GUI负责? 如果单击GUI中的按钮,它是否应显示弹出窗口并处理任何更新的值? 如果有验证逻辑,它应该检查并更新缺失/无效字段吗? 它应该处理任何事件处理程序逻辑,例如点击,值更改等等吗?
这个清单可能会继续下去。但是,我想基本的问题是GUI应该只显示类中的数据并处理将新数据输入类中吗?所有其他几乎所有事情都应该在其他地方处理。
答案 0 :(得分:3)
如果您遵循此模式,那么您的GUI应该只显示位于相应视图模型中的数据和调用命令。甚至诸如计时器刷新数据之类的操作也应该存在于视图模型中。然后你将有一个模型类,它提供数据的组成以及需要进行的任何验证/强制。
我们的想法是尽可能地使用视图,以便您可以轻松地交换资源字典,调整xaml并具有不同的外观/感觉,而无需再次重新测试所有逻辑。
在回答您的基本问题时,恕我直言,该视图应该知道如何可视化您的数据,如果您需要更新/编辑行为,那么它应该知道如何在视图模型上调用命令来为您执行此操作。任何其他设置都会开始破坏View / Viewmodel / Model之间的界限,并且可能对您不利。
希望这会有所帮助。这篇MVVM文章真的帮助了我:
http://www.codeproject.com/KB/WPF/MVVMQuickTutorial.aspx?msg=3655304#xx3655304xx
答案 1 :(得分:2)
您可以通过多种方式实施。 WPF并不在乎。
但是有许多用于处理GUI的架构模式。他们中的大多数在GUI部分中尽可能少地编写代码。大多数模式,如MCV / MVP,适合许多GUI工具包。专门为WPF设计的模式是MVVM。要学习MVVM,你可以通过一本书,google或者根据你喜欢的方式观看一些视频。
答案 2 :(得分:0)
您的GUI代码(也就是您的视图)应该只提供一种在模型中显示数据和调用功能的方法(如果需要,还可以查看模型)。
如果你做得对,大部分时间你的观点将是纯XAML而根本没有代码隐藏。有时您会需要一些代码,例如,您有一些按钮以奇怪的方式进行交互。在这些情况下,我经常将该功能封装到自定义控件中。
此外,如果你做得对,你通常会在你的视图模型中拥有几乎代码,许多视图根本不需要视图模型。
回答您的具体问题:
如果视图中的按钮单击应显示一个弹出窗口,该弹出窗口显示对象可见的每个位置(即对象更改为新状态),该按钮将设置视图模型的属性,模板将显示只要属性为true,就弹出。
如果视图中的按钮单击应仅在单击按钮的视图中显示弹出窗口,则应使用事件触发器定义弹出窗口,以便在单击按钮时显示该窗口。
< / LI>如果视图中的按钮单击应该切换一个布尔值,只需切换一个ToggleButton或其子类,并将其绑定到该值。
如果视图中的按钮单击应该为单个字段分配单个值,则应该附加一个完全相同的命令(即,您可能有一个带有参数的“SetProperty”命令,指示哪个属性什么价值)。
如果视图中的按钮单击应更新多个值或以复杂方式更新,则应使用视图模型并处理其中的复杂性。
如果按钮单击应该执行两个单独的操作(例如更新值和显示弹出窗口),则应实现多命令类以允许您在XAML中表达双重操作。
如果有验证逻辑来检查缺少的必填字段,它应该在您的模型中,因为有效的概念是该对象固有的。模型对象的属性应指示是否缺少字段。
如果有验证逻辑来检查特定视图的特定要求,它应该在您的视图模型中。同样,视图模型的属性由视图绑定以显示有效性并禁用UI(例如提交按钮)。
您的视图永远不会处理Click事件,除非是在一个简单的一分钟程序中。您应该使用命令,无论是内置命令还是您定义的命令。对于简单情况,可以仅使用XAML(例如SetProperty或Paste)调用命令。如果需要自定义代码来处理您的命令,那么该代码应该在您的模型或视图模型中。
您的视图永远不会处理值已更改的事件。 WPF的绑定系统非常善于处理这些。在WPF的内置机制不足的情况下,应创建一个处理特定方案的自定义控件或附加属性。