2009-11-17 11 views
23

¿Cuál es un buen ejemplo de la potencia de los eventos de interfaz (declarar eventos dentro de la interfaz)?Uso práctico de eventos de interfaz

La mayoría de las veces solo he visto métodos abstractos públicos dentro de la interfaz.

Respuesta

42

Utilicé eventos para señalar cuando un puerto serie recibía datos.

Aquí está mi interfaz.

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

Los eventos en las interfaces funcionan básicamente como los métodos. Puede usarlos de la misma manera que usaría cualquier interfaz.

public interface IInterface { 
    event EventHandler QuestionAsked; 
} 

public class Class : IInterface { 
    event EventHandler QuestionAsked; 

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

aquí es un ejemplo

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); 
    } 
    } 
} 

Tengo algo de código como este en 1 de mis aplicaciones. La aplicación fue escrita en winforms, luego se actualizó a WPF.

+0

Al generar un evento, debe [hacer una copia del evento] (https://msdn.microsoft.com/en-us/library/w369ty8x%28v=vs.100%29.aspx) (consulte ' OnRaiseCustomEvent() ') para evitar la posibilidad de una ** condición de carrera **:' EventHandler handler = this.Closed; if (handler! = null) {...} ' – DavidRR

16

Un excelente ejemplo dentro del .NET framework es la interfaz INotifyPropertyChanged. Esta interfaz consta de un solo miembro: el evento PropertyChanged.

En WPF, puede indicar que un control mostrará una propiedad específica de una instancia de objeto. ¿Pero cómo se actualizará este control si la propiedad subyacente cambia?

Si el objeto dependiente implementa el INotifyPropertyChanged interfaz, el marco WPF solo puede escuchar PropertyChanged y actualizar adecuadamente.

2

Un escenario clásico es el patrón MVP con vistas pasiva. El formulario implementa una interfaz de vista que tiene un evento NameChanged. El presentador que crea/usa la vista se suscribe a este evento. Cuando se cambia el nombre del texto en el cuadro de texto, la vista desencadena este evento. El presentador es notificado. Dado que el presentador solo conoce el evento de la interfaz de vista, puede proporcionar una vista simulada para probar. La vista está completamente desacoplada del presentador.

+0

En el artículo [Estilos de presentador de Model View] (https://lostechies.com/derekgreer/2008/11/23/model-view-presenter-styles/) que describe tres patrones de MVP diferentes, el tercer patrón llamado ** Observando el estilo del presentador ** parece estar más alineado con el patrón ** Vista pasiva ** que se describe aquí. – DavidRR

Cuestiones relacionadas