Я просто искал тот же ответ, однако мой класс также является отправителем событий для WPF, поэтому он должен выглядеть так же, как обычный класс отправителя событий C # / WPF. Поэтому я просто добавил это:
Отправителю:
- перечисление со свойствами name - это неудачный обходной путь из-за отсутствия nameof
- один дополнительный метод для записи запросов
Получателю:
- запрос события для данного перечисления
Код отправителя:
public enum Properties
{
NetworkFileName,
DatasetFileName,
LearningWatch
}
private string network_filename;
public string NetworkFileName
{
get { return network_filename; }
private set
{
if (network_filename != value)
{
network_filename = value;
OnPropertyChanged(Properties.NetworkFileName.ToString());
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
public void OnChange(Properties prop, Action<object, PropertyChangedEventArgs> action)
{
PropertyChanged += new PropertyChangedEventHandler((obj, args) => { if (args.PropertyName == prop.ToString()) action(obj, args); });
}
А получателю:
private void OnNetworkLoaded(object sender, PropertyChangedEventArgs e)
{
SetTitle();
}
...
ExpManager.OnChange(ExperimentManager.Properties.DatasetFileName, OnDatasetLoaded);
Это все еще уродливо, но по крайней мере:
- Мне не нужно иметь дело с "если" в приемнике
- Я могу легко создать несколько обработчиков событий
- совместимо с WPF
- нет волшебных струн (я их ненавижу)
Недостатки:
- омрачение разрушает это (но у меня есть специальный класс для этого случая, этот проект только для меня, так что здесь нет проблем)