我在一个自定义控件中有一个列表框。我将这个自定义控件用于表单中。我希望能够在表单工作时获得列表框索引更改事件。我该怎么做?
public event EventHandler<WhatEverEventArgs> IndexChanged {
add { listBox.IndexChanged += value; }
remove { listBox.IndexChanged -= value; }
}
如果您正在使用WinForms,则需要手动连接此事件。在自定义控件上创建具有相同签名的事件,在自定义控件内部的原始列表框上创建处理程序,并在此处理程序中触发新创建的事件。(如果您正在使用WPF,则忽略所有内容)
无论如何,您都需要重新触发SelectedIndexChanged事件。当然,您还需要让客户端代码读取当前选定的项。因此:
public partial class UserControl1 : UserControl {
public event EventHandler SelectedIndexChanged;
public UserControl1() {
InitializeComponent();
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) {
EventHandler handler = SelectedIndexChanged;
if (handler != null) handler(this, e);
}
public object SelectedItem {
get { return listBox1.SelectedItem; }
}
}
this
触发的,而不是在您的用户控件中的某个其他控件中的“未知”控件触发,如果您只是在listBox1.SelectedIndexChanged += value
中执行。 - Patrick查看Ninject的扩展程序MessageBroker,在索引更改时引发一个发布事件,并在表单侧订阅该事件。
在大多数情况下,MessageBroker非常有用。
另一个想法是实现观察者模式,并将表单作为观察者添加到控件事件中。