2009-11-17 2 views

Répondre

42

J'ai utilisé des événements pour signaler qu'un port série recevait des données.

Voici mon interface.

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

Les événements dans les interfaces fonctionnent à peu près comme des méthodes. Vous pouvez les utiliser juste comment vous utiliseriez n'importe quelle interface.

public interface IInterface { 
    event EventHandler QuestionAsked; 
} 

public class Class : IInterface { 
    event EventHandler QuestionAsked; 

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

ici est un exemple

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

J'ai un code comme ceci dans 1 de mes applications. L'application a été écrite en Winforms, puis mise à niveau vers WPF.

+0

Lorsque vous déclenchez un événement, vous devez [effectuer une copie de l'événement] (https://msdn.microsoft.com/en-us/library/w369ty8x%28v=vs.100%29.aspx) (voir ' OnRaiseCustomEvent() ') pour éviter la possibilité d'une ** condition de concurrence **:' EventHandler handler = this.Closed; if (handler! = null) {...} ' – DavidRR

16

Un excellent exemple dans le framework .NET est l'interface INotifyPropertyChanged. Cette interface est composée d'un seul membre: l'événement PropertyChanged.

Dans WPF, vous pouvez indiquer qu'un contrôle affichera une propriété spécifique d'une instance d'objet. Mais comment ce contrôle sera-t-il mis à jour si la propriété sous-jacente change?

Si l'objet lié implémente l' INotifyPropertyChanged l'interface, le cadre WPF peut simplement écouter PropertyChanged et mettre à jour de façon appropriée.

2

Un scénario classique est le modèle MVP avec vue passif. Le formulaire implémente une vue inteface qui a un événement NameChanged. Le présentateur qui crée/utilise la vue s'abonne à cet événement. Lorsque le texte du nom dans la zone de texte est modifié, la vue déclenche cet événement. Le présentateur est alors averti. Étant donné que le présentateur ne connaît que l'événement depuis l'interface de visualisation, vous pouvez fournir une vue fictive à tester. La vue est complètement découplée du présentateur.

+0

Dans l'article [Styles Présentateur de modèle] (https://lostechies.com/derekgreer/2008/11/23/model-view-presenter-styles/) décrit trois modèles MVP différents, le troisième modèle appelé ** Observing Presenter Style ** semble être le plus étroitement aligné sur le modèle ** Passive View ** décrit ici. – DavidRR