5

我有一个包含项目列表的用户控件,当 currentIndex 更改时我会引发一个事件,此外,当它更改时,我必须调用另外两个方法来验证和更改控件的外观(更改图像和阻止/取消阻止一些按钮)。

我想知道什么,主要是出于好奇,因为它已经在工作了,什么时候调用这两种方法更合适?

CurrentIndex我应该在物业本身内打电话给他们吗?我应该打电话给他们OnCurrentIndexChanged(...)吗?我应该在课堂上处理事件并在那里进行吗?

4

3 回答 3

6

我假设您已经实现了标准事件生成模式并设置了 OnCurrentIndexChanged protected virtual,以便派生类可以覆盖该方法并更改事件生成和/或处理。

不幸的是,这需要阅读茶叶,为什么有人要覆盖该方法?更严重的是,当他们这样做时,如何覆盖该方法会破坏您的控制?对于那些不太了解代码的人来说,这很难猜到,对你来说也不是很容易。此处应用的原则(也用于 .NET 框架代码)是尽可能少做。只是提出事件,没有别的。当派生类做一些愚蠢但完全常见的事情时,它可以最大限度地减少损坏的可能性,比如不调用 base.OnCurrentIndexChanged。

控件的行为是 UserControl 的实现细节。因此,在 CurrentIndex 属性设置器中更改它们的属性,然后调用 OnCurrentIndexChanged()。如有必要,从您的类派生的任何人都可以覆盖该行为。当他们忘记调用您的 OnCurrentIndexChanged() 方法时,一切都不会出错。但请注意,您需要使控制变量受保护而不是私有。因此,如果需要,他们可以覆盖该行为。

如果这对您来说太吓人了,请不要犹豫,根本不使用虚拟方法。用你的控件来容纳成千上万的程序员并不常见 :)

于 2012-04-16T18:55:45.953 回答
2

在用户控件中,我将有一个表示所选项目的属性。然后,在对象的设置过程中,引发事件方法以更改您的用户控件。这样,以后如果需要添加更多的监听器,只需要在 setter 方法中添加另一个处理程序即可。这在 MVVM 应用程序中很常见,并且非常易于维护。

于 2012-04-12T19:05:10.370 回答
1

因为您的 UserControl 充当 ListControl,所以您需要实现两个事件和两个属性。

public event System.EventHandler SelectedIndexChanged;
public event System.EventHandler SelectionChangeCommitted;

public int SelectedIndex {
    get;
    set;
}

public T SelectedItem { // Where T is whatever your type is
    get;
    set;
}

SelectedIndexChanged应始终用于更改所选索引时始终需要触发的操作。SelectionChangeCommitted应在用户物理更改选择时触发。两者之间的分离是一个重要的区别,.NET 中的大多数控件都遵循这种模式(例如 ComboBox),但可能不会对事件使用相同的名称。

现在,话虽如此,如果您需要更改属性的控件也在同一个用户控件中,那么您当然应该在相应事件中的用户控件代码中处理它。否则,代码应该通过订阅事件并在那里完成工作来实现用户控件(例如表单或其他用户控件)的任何人。

该顺序实际上取决于您的要求,但SelectedIndexChanged始终提出(但每次更改不超过一次,因为这会引入奇怪的行为),并且SelectionChangeCommitted只能由用户提出(例如,设置 SelectedIndex 或 SelectedItem)。

一个好的经验法则是,如果您的内部事情必须在用户知道之前发生,请先调用 SelectedIndexChanged,然后再调用 SelectionChangeCommitted。如果没关系,要么。稍后更改顺序可能会导致实施控制的人员发生重大更改,因此请确保您的决定是可靠的。

两者之间的区别在于 SelectedIndex 和 SelectedItem 将通过内部清除列表、添加新项目等进行更新,但这并不一定意味着它是一个物理用户操作,应该会导致两个事件都被触发。

希望这可以帮助。

于 2012-04-19T13:59:17.803 回答