#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. Спасибо, Клаус. Работает. И спасибо Энди, что указал мне на