2009-11-17 53 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