Привет, я узнал о событии и делегате от https://www.youtube.com/watch?v=jQgwEsJISy0&t=1230s. В этом он говорит, что для создания события нам нужно три шага
- Определение делегата
- Определение событияосновываясь на этом делегате
- Поднять это событие
Я последовал за ним и создал приложение в консоли, но поскольку я работаю в WPF, я опубликую здесь код, который я использовал в WPF, икод, как показано ниже:
namespace WpfApp5
{
public delegate void step1DelegateDefinition(); // Step-1: Define a delegate
public interface INotifyOnVideoEncoded
{
event step1DelegateDefinition EventDefinedInInterface;// Step-2a: Define an event based on that delegate
}
public partial class MainWindow : Window, INotifyOnVideoEncoded
{
public event step1DelegateDefinition EventDefinedInInterface; //Step-2b: Define an event based on that delegate
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
ObservableCollection<string> NotificationText = new ObservableCollection<string>();
EventDefinedInInterface += SubscriberMethodForConection;// A method corresponding to delegate is subscribed for that event
Encode();
}
public void Encode()
{
MessageBox.Show("Encoding Video...");
Thread.Sleep(3000);
PublisherMethodForConnection(); //Step-3: Raise an event
}
public void PublisherMethodForConnection()
{
if (EventDefinedInInterface != null)
EventDefinedInInterface();
else
MessageBox.Show("No Subscriber");
}
public void SubscriberMethodForConection()
{
MessageBox.Show("MailService: Sending an email...");
}
}
}
Итак, насколько мне известно,
Событие должно быть подписано для выполнения с использованием знака + =.
Но в отличие от моих знаний, когда я использую событие changechange из INotifyPropertyChange, знак + = не нужен.и более того, странно, что + = (подписка на событие) выполняется динамически, но потому что, если я сначала инициализирую свойство (в моем случае, представленном в коде ниже, если я инициализирую значение FirstName = Jeff и LastName = Buckley), то оно срабатываетчасть else в моем коде и показывает сообщение «Нет подписчика, которому функция MyOnPropertyChanged может вызвать» в начале.Я полагаю, что это потому, что подписчик на событие является нулевым (то есть нет оператора + = +, присваивающего событие, как я ожидал), но позже, когда окно загружено, кажется, что есть подписчик на событие, хотя я не делал этого в коде.Ниже приведен мой код Реализация свойства изменена.
namespace UnderstandingINotifyPropertyChanged
{
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _FirstName;
private string _FullName;
private string _LastName;
public string FirstName
{
get { return _FirstName; }
set
{
if (_FirstName != value)
{
_FirstName = value;
MyOnPropertyChanged_PublisherMethod("FirstName");
MyOnPropertyChanged_PublisherMethod("FullName");
}
}
}
public string LastName
{
get { return _LastName; }
set
{
if (_LastName != value)
{
_LastName = value;
MyOnPropertyChanged_PublisherMethod("Lastname");
MyOnPropertyChanged_PublisherMethod("FullName");
}
}
}
public string FullName
{
get { return _FullName = _FirstName + " " + _LastName; }
}
private void MyOnPropertyChanged_PublisherMethod(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
else
MessageBox.Show("There is no Subscriber to which MyOnPropertyChanged function can call ");
}
public MainWindow()
{
InitializeComponent();
FirstName = "Jeff";
LastName = "Buckley";
this.DataContext = this;
}
}
}
Так что моя путаница в первом коде, я должен назначить событие, используя + =, но во втором коде это работает без + +.Я не могу понять, как второй код запускался без использования + =, поскольку событие должно быть связано с использованием + = к подписчику.
Я пытался читать онлайн и смотреть видео для объяснения, но не мог понять, по какой причине я спрашиваю здесь.До сих пор я многому научился здесь, спасибо вам за это и спасибо, что вы нашли время, чтобы прочитать этот вопрос, я могу понять это с вашей помощью.