2009-11-17 54 views
23

接口事件的强大功能(在接口中声明事件)的一个很好的例子是什么?实际使用接口事件

大多数时候我只看到了接口中的公共抽象方法。

回答

42

我使用事件来指示串行端口接收数据的时间。

这是我的界面。

public interface ISerialPortWatcher 
{ 
    event EventHandler<ReceivedDataEventArgs> ReceivedData; 
    event EventHandler StartedListening; 
    event EventHandler StoppedListening; 

    SerialPortSettings PortOptions { set; } 

    bool Listening { get; set; } 
    void Stop(); 
    void Start(); 
} 

public class ReceivedDataEventArgs : EventArgs 
{ 
    public ReceivedDataEventArgs(string data) 
    { 
     Data = data; 
    } 
    public string Data { get; private set; } 
} 
4

接口中的事件几乎像方法一样工作。你可以使用它们,你将如何使用任何接口。

public interface IInterface { 
    event EventHandler QuestionAsked; 
} 

public class Class : IInterface { 
    event EventHandler QuestionAsked; 

    //As with typical events you might want an protected OnQuestionAsked 
} 
13

这里是一个例子

public interface IMainAppWindow 
{ 
    event EventHandler Closed; 
} 

// version 1 main window 
public MainForm : Form , IMainAppWindow 
{ 

} 

// version 2 main window 
public MainWindow : Window , IMainAppWindow 
{ 
    event EventHandler Closed; 

    public void OnClosed(object sender,RoutedEventArgs e) 
    { 
    if(Closed != null) 
    { 
     Closed(this,e); 
    } 
    } 
} 

我有一些像这样的代码在我的应用程序1。该应用程序是用winforms编写的,然后升级到WPF。

+0

当引发事件时,您应该[复制事件](https://msdn.microsoft.com/en-us/library/w369ty8x%28v=vs.100%29.aspx)(请参阅' OnRaiseCustomEvent()')来避免**竞争条件的可能性**:'EventHandler handler = this.Closed; if(handler!= null){...}' – DavidRR 2015-08-12 17:18:20

16

.NET框架内的一个很好的例子是INotifyPropertyChanged接口。该接口只包含一个成员:PropertyChanged事件。

在WPF中,您可以声明控件将显示对象实例的特定属性。但是如果底层属性发生变化,这个控件将如何更新?

如果绑定的对象实现了 INotifyPropertyChanged的接口,WPF框架可以只听的PropertyChanged和更新适当。

2

一个典型的场景是MVP模式与被动视图。 表单实现了具有NameChanged事件的视图接口。 创建/使用视图的演示者订阅了此事件。 当文本框中的名称文本发生更改时,会触发此事件。然后通知主持人。 由于演示者只知道来自视图界面的事件,因此您可以提供模拟视图进行测试。该视图与演示者完全分离。

+0

在文章[Model View Presenter Styles](https://lostechies.com/derekgreer/2008/11/23/model-view-presenter-styles/)中描述了三种不同的MVP模式,称为** Observing Presenter Style **的第三种模式似乎与此处描述的** Passive View **模式最为接近。 – DavidRR 2015-08-12 17:27:11