Правильный способ передачи событий с уровня низкого уровня в пользовательский интерфейс? [Дубликат]

Типы ссылок по умолчанию равны null, чтобы указать, что они не ссылаются на какой-либо объект. Следовательно, если вы попытаетесь получить доступ к объекту, на который ссылаетесь, а его нет, вы получите исключение NullReferenceException.

Для Ex:

SqlConnection connection = null;
connection.Open();

Когда вы запускаете это кода, вы получите:

System.NullReferenceException: Object reference not set to an instance of an object.

Вы можете избежать этой ошибки, например, следующим образом:

if (connection != null){
    connection.Open();
}

Примечание. Чтобы избежать этой ошибки, вы всегда должны инициализировать свои объекты прежде чем пытаться что-либо сделать с ними.

6
задан Elmex 18 December 2010 в 19:43
поделиться

3 ответа

Таким образом, вы можете сделать своим издателем формы (и посредником между элементами управления), и все ваши элементы управления будут абонентами, которые будут уведомлены о событии.

Событие, произошедшее в элементе управления, будет уведомление и обработчик событий в форме будут уведомлять другие элементы управления, подписавшиеся на это событие.

2
ответ дан Jahan Zinedine 26 August 2018 в 12:09
поделиться

Вы можете использовать статическое событие:

public static class MyGlobalEvent {
    public static event EventHandler MyEvent;

    public static void FireMyEvent(EventArgs args) 
    {
        var evt = MyEvent;
        if (evt != null)
            evt(args);
    }
}

Подпишитесь обычным способом:

MyGlobalEvent.MyEvent += args => Console.WriteLine("Event Was Fired.");

Пожар, как вы считаете нужным:

MyGlobalEvent.FireMyEvent(new EventArgs());
8
ответ дан Kirk Woll 26 August 2018 в 12:09
поделиться

То, что вы описываете, выглядит как шаблон посредника , в котором объекты обмениваются сообщениями. Эти сообщения могут быть реализованы как события, обратные вызовы или любой другой механизм.

Вы можете использовать реализацию, такую ​​как класс MVVM Light Messenger (эта структура предназначена для использования с WPF и Silverlight, но вы можете получить код для этого конкретного класса и использовать его в WinForms)

// Register for a specific message type
Messenger.Default.Register<TypeOfTheMessage>(this, DoSomething);
...

// Called when someone sends a message of type TypeOfTheMessage
private void DoSomething(TypeOfTheMessage message)
{
    // ...
}

// Send a message to all objects registered for this type of message
Messenger.Default.Send(new TypeOfTheMessage(...));

Большое преимущество класса Messenger в отношении статического события заключается в том, что он использует слабые ссылки , поэтому он не мешает сборке подписанных объектов, что снижает риск утечек памяти.

Подробную информацию о классе Messenger

см. в этой ссылке
8
ответ дан Thomas Levesque 26 August 2018 в 12:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: