Хорошо, я понял, как решить эту проблему.По сути, я создал свойство с полем private static event
, как показано ниже:
private static event PropertyChangedEventHandler _propertyChanged;
public PropertyChangedEventHandler PropertyChanged
{
get { return _propertyChanged; }
set { _propertyChanged = value; }
}
Таким образом, я мог бы заставить следующий код работать должным образом:
protected void OnPropertyChanged(string name)
{
_propertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
Infact, _propertyChanged
больше не был null
, так как я подписался на событие со следующим кодом (формально идентичным тому, который был опубликован в моем вопросе, с той разницей, что я использовал свойство PropertyChanged
, подкрепленное частным статическим полем _propertyChanged
):
_myService = DependencyService.Get<IMyInterface>();
_myService.PropertyChanged += (sender, e) => { /* do stuff */ };
Теперь я думаю, что это было необходимо, потому что я использую DependencyService
, иначе в обычном коде эта проблема не должна появляться.В любом случае, я предполагаю, является ли идея иметь свойство EventHandler
, подкрепленное полем private static event
, хорошей практикой кода или просто звучит странно.Но это работает, и это работает довольно хорошо.
Но, чтобы сделать все это, мне пришлось изменить это:
public interface IMyInterface : INotifyPropertyChanged
{
/* code relating the interface */
}
на это:
public interface IMyInterface
{
PropertyChangedEventHandler PropertyChanged { get; set; }
/* code relating the interface */
}
Мне пришлось добавить это свойство в IMyInterface
, чтобы я мог получить к нему доступ из своего кода проекта Forms.Более того, я больше не реализую INotifyPropertyChanged
, потому что INotifyPropertyChanged
просит меня реализовать интерфейс с:
public event PropertyChangedEventHandler PropertyChanged
внутри моего реализующего класса, но я заменил его на
private static event PropertyChangedEventHandler _propertyChanged;
public PropertyChangedEventHandler PropertyChanged
{
get { return _propertyChanged; }
set { _propertyChanged = value; }
}
как я показал выше.