我在C#WinForms中有一个名为BaseControl
的自定义控件,我有一个名为Selected
的属性。
我希望在基本控件中有一个事件SelectedChanged
和虚方法OnSelecteChanged
,它们的行为应该与Control
类中的许多属性相同,即{{{ 1}}事件和Click
方法。
意味着从我的OnClick
派生的任何人都可以绑定到该事件或者可以覆盖BaseControl
方法。
因此,当OnSelectedChanged
属性的值被更改时,应该触发事件,如果方法被覆盖,则控制应该转到该方法。
我知道如何解雇这个事件,但不知道该怎么做方法。
请指导我......
答案 0 :(得分:3)
以下是如何实施事件的示例:
public class BaseControl : Control
{
private object _selected;
public object Selected
{
get { return _selected; }
set
{
if (!Equals(_selected, value))
{
_selected = value;
OnSelectedChanged(EventArgs.Empty);
}
}
}
public event EventHandler SelectedChanged;
protected virtual void OnSelectedChanged(EventArgs e)
{
if (SelectedChanged != null)
SelectedChanged(this, e);
}
}
通过此示例,您可以覆盖覆盖类中的OnSelectedChanged
,如下所示:
public class MyControl : BaseControl
{
protected override void OnSelectedChanged(EventArgs e)
{
base.OnSelectedChanged(e);
// My own logic.
}
}
答案 1 :(得分:1)
private bool _selected;
public bool Selected
{
get { return _selected; }
set
{
if (value != _selected)
{
_selected = value;
OnSelectedChanged();
}
}
}
public event EventHandler SelectedChanged;
protected virtual void OnSelectedChanged()
{
var handler = SelectedChanged;
if (handler != null)
handler(this, EventArgs.Empty);
}
答案 2 :(得分:0)
基本上,您不会从Selected
属性设置器中触发事件 - 您调用该方法,并使该方法调用该事件。任何覆盖该方法的人都应该调用base.OnSelectedChanged
以确保该事件仍然会触发。所以你的方法应该是这样的:
protected virtual void OnSelectedChanged(EventArgs e) {
EventHandler handler = Selected; // Or your own delegate variable
if (handler != null) {
handler(this, e);
}
}