我有一个包含项目列表的用户控件,当 currentIndex 更改时我会引发一个事件,此外,当它更改时,我必须调用另外两个方法来验证和更改控件的外观(更改图像和阻止/取消阻止一些按钮)。
我想知道什么,主要是出于好奇,因为它已经在工作了,什么时候调用这两种方法更合适?
CurrentIndex
我应该在物业本身内打电话给他们吗?我应该打电话给他们OnCurrentIndexChanged(...)
吗?我应该在课堂上处理事件并在那里进行吗?
我有一个包含项目列表的用户控件,当 currentIndex 更改时我会引发一个事件,此外,当它更改时,我必须调用另外两个方法来验证和更改控件的外观(更改图像和阻止/取消阻止一些按钮)。
我想知道什么,主要是出于好奇,因为它已经在工作了,什么时候调用这两种方法更合适?
CurrentIndex
我应该在物业本身内打电话给他们吗?我应该打电话给他们OnCurrentIndexChanged(...)
吗?我应该在课堂上处理事件并在那里进行吗?
我假设您已经实现了标准事件生成模式并设置了 OnCurrentIndexChanged protected virtual
,以便派生类可以覆盖该方法并更改事件生成和/或处理。
不幸的是,这需要阅读茶叶,为什么有人要覆盖该方法?更严重的是,当他们这样做时,如何覆盖该方法会破坏您的控制?对于那些不太了解代码的人来说,这很难猜到,对你来说也不是很容易。此处应用的原则(也用于 .NET 框架代码)是尽可能少做。只是提出事件,没有别的。当派生类做一些愚蠢但完全常见的事情时,它可以最大限度地减少损坏的可能性,比如不调用 base.OnCurrentIndexChanged。
控件的行为是 UserControl 的实现细节。因此,在 CurrentIndex 属性设置器中更改它们的属性,然后调用 OnCurrentIndexChanged()。如有必要,从您的类派生的任何人都可以覆盖该行为。当他们忘记调用您的 OnCurrentIndexChanged() 方法时,一切都不会出错。但请注意,您需要使控制变量受保护而不是私有。因此,如果需要,他们可以覆盖该行为。
如果这对您来说太吓人了,请不要犹豫,根本不使用虚拟方法。用你的控件来容纳成千上万的程序员并不常见 :)
在用户控件中,我将有一个表示所选项目的属性。然后,在对象的设置过程中,引发事件方法以更改您的用户控件。这样,以后如果需要添加更多的监听器,只需要在 setter 方法中添加另一个处理程序即可。这在 MVVM 应用程序中很常见,并且非常易于维护。
因为您的 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 将通过内部清除列表、添加新项目等进行更新,但这并不一定意味着它是一个物理用户操作,应该会导致两个事件都被触发。
希望这可以帮助。