【问题标题】:What is a WPF GUI responsible for?WPF GUI 负责什么?
【发布时间】:2010-11-09 20:29:14
【问题描述】:

我使用 WPF 和 Xaml 已经有一段时间了,并且非常喜欢它。但是,我可能仍在像在 WinForm 时代那样设计东西,在 GUI 部分有太多代码和责任。

Anways,在 WPF 模型中,GUI 究竟负责什么? 如果单击 GUI 中的按钮,它是否应该显示弹出窗口并处理任何更新的值? 如果有验证逻辑,它应该检查并更新丢失/无效的字段吗? 它是否应该处理任何事件处理程序逻辑,例如点击、值更改等?

这个列表可能还不止一个。但是,我想基本的问题是 GUI 是否应该只显示类中的数据并处理将新数据输入到类中?几乎所有其他事情都应该在其他地方处理。

【问题讨论】:

  • 你可能没用好措辞。 GUI 的工作是为您的用户提供一种易于使用和易于理解的方式与您的程序进行交互。创建该 GUI 所需的一切都是您的工作。

标签: .net wpf user-interface xaml


【解决方案1】:

wpf gui 在技术上可以根据方法做任何事情。您应该会看到一些我使用过的第一个 wpf 应用程序,并且仍在使用。如果您想遵循最佳实践并充分利用您的 wpf 工作,那么您应该使用 MVVM 模式。

如果您遵循此模式,那么您的 GUI 应该只显示位于相应视图模型中的数据和调用命令。甚至诸如计时器刷新数据之类的操作也应该存在于视图模型中。然后,您将拥有一个模型类,它提供数据的组合以及需要发生的任何验证/强制。

我们的想法是使视图尽可能通用,以便您可以轻松地换出资源字典、调整 xaml 并拥有不同的外观/感觉,而无需再次重新测试所有逻辑。

针对您的基本问题,恕我直言,视图应该知道如何可视化您的数据,如果您需要更新/编辑行为,那么它应该知道如何调用视图模型上的命令来为您执行此操作。任何其他设置都会开始混淆 View/Viewmodel/Model 之间的界限,并且可能对您不利。

希望这会有所帮助。这篇 MVVM 文章真的帮助了我:

http://www.codeproject.com/KB/WPF/MVVMQuickTutorial.aspx?msg=3655304#xx3655304xx

【讨论】:

    【解决方案2】:

    您可以通过多种方式实现它。 WPF 并不关心。

    但是有许多用于处理 GUI 的架构模式。他们中的大多数将尽可能少的代码放在 GUI 部分中。大多数模式,如 MCV/MVP,适合许多 GUI 工具包。专为 WPF 设计的模式是 MVVM。要学习 MVVM,您可以通过一本书、谷歌搜索或观看一些视频,这取决于您喜欢学习的方式。

    【讨论】:

      【解决方案3】:

      您的 GUI 代码(也称为您的视图)应该只是提供一种在您的模型(或视图模型,如果您需要)中显示数据和调用功能的方法。

      如果您做得对,大多数时候您的视图将是纯 XAML,根本没有代码隐藏。有时,如果您有几个按钮以一种奇怪的方式交互,您将需要一些代码。在这些情况下,我经常将该功能封装到自定义控件中。

      另外,如果你做得对,你的视图模型中通常会有几乎代码,而且许多视图根本不需要视图模型。

      回答您的具体问题:

        1234563每当属性为真时弹出。
      • 如果视图中的按钮单击应仅在单击按钮的视图中显示弹出窗口,则应使用事件触发器定义弹出窗口,以便在单击按钮时显示。

      • 如果在视图中单击按钮应该切换一个布尔值,只需一个 ToggleButton 或其子类之一并将其绑定到该值。

      • 1234563以及什么价值)。
      • 如果视图中的按钮单击应更新多个值或以复杂的方式执行此操作,则应使用视图模型并处理那里的复杂性。

      • 如果一个按钮单击应该做两个不同的事情(例如更新值显示一个弹出窗口),你应该实现一个多命令类来允许你在 XAML 中表达双重动作。

      • 如果有验证逻辑来​​检查缺少的必填字段,它应该在您的模型本身中,因为有效的概念是该对象固有的。模型对象的属性应指示是否存在缺失字段。

      • 如果有验证逻辑来​​检查特定视图的特定要求,它应该在您的视图模型中。同样,视图模型的一个属性被视图绑定以显示有效性和禁用 UI(例如提交按钮)。

      • 您的视图应该处理 Click 事件,除非是在一个微不足道的一分钟程序中。您应该使用一个命令,可以是内置命令,也可以是您定义的命令。对于简单的情况,可以仅使用 XAML 调用命令(例如 SetProperty 或 Paste)。如果需要自定义代码来处理您的命令,该代码应该在您的模型或视图模型中。

      • 您的视图应该从不处理值更改事件。 WPF 的绑定系统非常擅长处理这些。在 WPF 的内置机制不够用的情况下,应创建处理特定场景的自定义控件或附加属性。

      【讨论】:

        猜你喜欢
        • 2014-07-12
        • 2012-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-28
        相关资源
        最近更新 更多