2009-11-17 2 views

ответ

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

16

Прекрасным примером в рамках платформы .NET является интерфейс INotifyPropertyChanged. Этот интерфейс состоит только из одного члена: событие PropertyChanged.

В WPF вы можете указать, что элемент управления отобразит определенное свойство экземпляра объекта. Но как этот контроль будет обновляться, если изменяется базовое свойство?

Если связанный объект реализует INotifyPropertyChanged интерфейса, рамки WPF можно просто слушать PropertyChanged и обновить соответствующим образом.

2

Классический сценарий MVP модель с пассивным видом. Форма реализует представление inteface, которое имеет событие NameChanged. Ведущий, создающий/использующий представление, подписывается на это событие. Когда текст названия в текстовом поле изменен, загорается это событие. Затем ведущий уведомляется. Поскольку ведущий знает о событии из интерфейса просмотра, вы можете предоставить макет для тестирования. Вид полностью отделен от ведущего.

+0

В статье [Стили представления презентатора модели] (https://lostechies.com/derekgreer/2008/11/23/model-view-presenter-styles/), который описывает три разных шаблона MVP, третий шаблон, называемый ** Observing Presenter Style **, как представляется, наиболее тесно связан с паттерном ** Passive View **, описанным здесь. – DavidRR

Смежные вопросы