【问题标题】:What's the "right" way to isolate control dependencies隔离控制依赖关系的“正确”方法是什么
【发布时间】:2010-10-10 07:53:45
【问题描述】:

我已经制定了在使用之前继承每个 UI 控件的个人规则。在前世,我一直认为这是你可以做的不太有用的事情,因为理由似乎总是“我可能想一次更改所有按钮上的字体”......这种动机从未得到回报...一次...永远。

不过,最近的两个项目改变了我对这种做法的看法。首先,我们需要一个一致的“ValueChanged”事件,这样我们就可以轻松地在我们的表单上实现一个“脏”标志,而无需大量的 switch 语句来在 Textbox 的“TextChanged”事件或 ListBox 的“SelectedIndexChanged”等之间进行选择。我们只是想在所有控件上监听一个一致的东西,并且对内置控件进行子类化很容易为我们带来了这一点。

在第二个项目中,我们尽一切努力使用基本控件,因为 UI 本来应该很简单,但几个月后,很明显他们不再打算削减它了,我们购买了 Telerik 控制套件。如果我们从一开始就继承了所有控件,那么将派生控件更改为从 Telerik 控件继承将在全局范围内为我们应用更改。相反,我们必须在所有表单设计器中进行一些搜索和替换。

所以这是我的问题:什么是相对优势和劣势

  1. 只需添加一个类,并使其从控件继承。
  2. 添加新的“自定义控件”并继承。
  3. 添加新的“组件”并继承。

最后,这三个都有相同的效果,你会得到一个新类型的按钮来放在你的表单上。我见过不同的人使用这三种方式,每个人似乎都认为他们的方式是最好的。我想我应该把这个讨论放在 StackOverflow 上,也许我们可以作为一个社区就哪一个是“正确”的方式达成共识。

注意:我已经有我的个人意见“正确”,但我想看看世界的想法。

【问题讨论】:

    标签: winforms user-controls controls webforms


    【解决方案1】:

    如果 1 和 2 都继承,那么它们在功能上是相同的,不是吗?其中一个应该是封装一个控件吗?在这种情况下,您需要添加很多直通成员。我不会推荐它。

    就我个人而言,如果没有很好的理由,我根本不会添加额外的继承...例如,“更改的事件”可能已经通过一些重载等进行了处理。使用 C# 3.0,由于扩展方法,这变得更加清晰- 即你可以有这样的东西:

    public static AddChangeHandler(
            this TextBox textbox, EventHandler handler) {
        testbox.TextChanged += handler;
    }
    public static AddChangeHandler(
            this SomethingElse control, EventHandler handler) {
        control.Whatever += handler;
    }
    

    只需使用myControl.AddChangeHandler(handler);(依靠myControl的静态类型来解析适当的扩展方法)。

    当然,您可以退后一步,在您自己的模型而不是 UI 上监听事件 - 让 UI 以基本方式更新模型,并在您自己的对象中包含逻辑模型(与控件无关)。

    【讨论】:

    • 在我们的例子中,我们使用的是被动视图 MVP 模型,因此在模型级别进行监听对我们不起作用。上面的示例经过简化,仅涉及设置问题本身的要点。 1 和 2 在功能上相同,但由于设计器文件的不同而在结构上有所不同。
    • 我喜欢用于连接事件的扩展方法解决方案,并且将来可能会使用它。不过,第二个问题仍然存在。最终,大多数项目都会遇到内置控件不再适用的问题,您需要迁移到第三方控件。
    • 似乎投票赞成答案导致它变得不可见......我将尝试再次使其保持中立,看看它是否会引起注意。稍后我会再次为您的答案投票...别担心。
    • 我曾希望引发与此人的讨论,但没有其他人回答。马克的答案是两者中最好的。我特别喜欢使用扩展方法实现相同目的的想法。它不像我尝试的那样“封装”,但它提出了一种我没有考虑过的有趣方法。
    【解决方案2】:

    我使用合成。我只需创建一个新的 UserControl 并添加我需要的控件。这很好用,因为:

    • 反正我从不使用这么多属性,所以传递方法保持在最低限度。
    • 我可以先从幼稚的方法开始,然后再对其进行改进。
    • 应该在整个站点中一致地设置外观属性。现在我可以一劳永逸地设置它们了。

    【讨论】:

      猜你喜欢
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 2022-07-30
      • 2010-09-23
      相关资源
      最近更新 更多