WeakEventManager неправильно обрабатывает интерфейсы?

#c# #wpf

#c# #wpf

Вопрос:

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

Когда я запускаю программу как есть, при вызове она выдает ошибку WeakEventManager (последнее утверждение, см. Комментарий «вот ошибка»). Он говорит, что PropertyChanged событие не включено IMyEventSource . Затем я подумал добавить event PropertyChangedEventHandler PropertyChanged в IMyEventSource . Это действительно устраняет проблему, но оставляет меня с предупреждением о том, что мое объявление события в интерфейсе скрыло бы унаследованный элемент. Что имеет смысл, поскольку IMyEventSource говорится, что это будет реализовано INotifyPropertyChanged . Похоже на уловку-22.

Очевидно, я могу принять предупреждение и добавить новое в объявление события. Но я надеюсь, что кто-нибудь может сказать мне, как сделать лучше.

 class Program
{
    public static void Main(string[] args)
    {
        MyEventSource source = new MyEventSource();
        WeakEventListener listener = new WeakEventListener(source);
        source.Name = "John Dow";
        Console.ReadLine();
    }
}

public interface IMyEventSource : INotifyPropertyChanged
{
    // event PropertyChangedEventHandler PropertyChanged;   // fixes the issue
    string Name { get; set; }
}

public class MyEventSource : IMyEventSource
{
    private string name;
    public string Name
    {
        get => name;
        set { name = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name")); ; }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

public class WeakEventListener
{
    private void OnEvent(object source, PropertyChangedEventArgs args) => Console.WriteLine("WeakEventListener received event.");

    public WeakEventListener(MyEventSource source)
    {
        WeakEventManager<IMyEventSource, PropertyChangedEventArgs>.AddHandler(source, "PropertyChanged", OnEvent); // here's the error
    }
}
  

Комментарии:

1. Должно быть WeakEventManager<INotifyPropertyChanged, PropertyChangedEventArgs>.AddHandler(source, "PropertyChanged", OnEvent); ?

2. Для этого есть специальный менеджер learn.microsoft.com/en-us/dotnet/api /…

3. Спасибо, Клаус. Работает. И спасибо Энди, что указал мне на