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

标签 wpf design-patterns mvvm user-interface mvp

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

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

我查看了 MVP(及其 WPF 变体 - MVVM),但在入门时遇到了一些麻烦。

假设我要构建一个 UI,这就是我认为我应该做的:

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

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

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

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

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

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

我在正确的轨道上吗?我应该调整我的方法吗?彻底改变?目前,我缺乏实现大型/复杂 UI 的经验/知识,所以我真的不知道我是否走在正确的轨道上。

谢谢

最佳答案

有点长,见谅!

So far, I've been using Code-Behinds, which is extremely easy to get-started, but hell when maintaining/changing/testing.



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

您的方法存在一些问题:

Create a "Main UI" Mediator class which specifies ALL high-level operations



而不是这样做,您的 Window 类充当“ Controller ”;重要的是,使用 指挥定义您的顶级操作。这样,您可以将 UserControls 从 Window 类中分离出来,因为 UserControl 只会调用 Commands.Open.Execute(null, this),而 Window 可以处理它,并且 UserControl 永远不会显式地依赖于 Window。

Create "ViewModel" classes for my model classes.



在 MVVM 中,VM 部分可以帮助您 - 如果您可以直接绑定(bind)到模型(即数据没有更改或者您不介意在模型中实现 INotifyPropertyChanged),那么执行此操作(即使你必须使用一些 IValueConverter 类)没关系 . ViewModels 主要用于当 View 与模型表示如此不同以至于破坏模型或“附加”仅在此特定 View 中才有意义的额外属性时会很难看。

while acting as a Change Manager...



请记住,WPF 通过 Dependency Properties 和 INotifyPropertyChanged 为您执行此操作;不要重新发明轮子;如果您编写 OnDataUpdate() 函数,这表明您没有正确使用数据绑定(bind)。

e.g, a sequence of operations need to be done before the UI can/should update, such as modifying items in a collection



这是指挥很棒 - 你的 CanExecute 函数可以应用任意复杂的逻辑来决定是否可以完成某个操作,如果你将它绑定(bind)到菜单或按钮等 UI 元素,它们将根据需要自动禁用/启用。

关于wpf - 需要有关在 WPF 中实现 UI 的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1397307/

相关文章:

c++ - C++ 中主要问题和设计问题之前的类

c# - Xamarin Forms MVVM 与实际模型

c# - MVVM:将 ContentControl 绑定(bind)到 CheckBox

c# - UWP - 将自定义转换器应用于 x :Uid directive 设置的值

java - java中的工厂模式

wpf - 哪种音频格式适用于Silverlight + WPF?

c# - 命令模式 : Executing multiple commands in sequence

c# - 如何在 MVVM 中捕获 DataAnnotations 验证

c# - 使用参数在 MVVM Light 中打开新窗口的最佳实践

c# - 即时管理和搜索 100,000 多个对象的有效方法? (C#)