C # - Xamarin.Forms - Служба зависимостей и событие

Я хотел бы получить уведомление с событием PropertyChanged, поднятым из класса MyClass реализующего интерфейс IMyInterface . Экземпляр этого класса извлекается с помощью DependencyService.Get<IMyInterface>();

Теперь это класс (проект Android), в котором есть свойство с фоновым полем:

class MyClass : IMyInterface {

    private bool _isEnabled;
    public bool IsEnabled
    {
        get { return _isEnabled; }
        private set { _isEnabled = value; OnPropertyChanged("IsEnabled"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string name)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }

    public void OnSomethingHappens() { //This method is called when something particular happens
        /* Some code... */
        IsEnabled = true; //The point where the property is changed
        /* ...some other code */
    }
}

Интерфейс (проект Forms) выглядит следующим образом:

public interface IMyInterface : INotifyPropertyChanged
{
    /* code relating the interface */
}

Этот интерфейс реализует INotifyPropertyChanged , чтобы иметь возможность прослушивать изменение свойства (как видно из вышеприведенного класса). Все идет нормально.

Проблема в том, что в моем проекте Forms я регистрирую обработчик событий с помощью этого:

_myService = DependencyService.Get<IMyInterface>();
_myService.PropertyChanged += (sender, e) => { /* do stuff */ };

Но когда свойство в моем классе реализации изменяется, PropertyChanged возвращает null, а это означает, что событие никогда не запускается.

Я хотел бы добавить немного: недавно я испытал доступ к DependencyService.Get<IMyInterface>().MyList свойству списка с DependencyService.Get<IMyInterface>().MyList был бесполезен, поскольку MyList оказался размером 0 , даже если этот список был заполнен внутри класса реализации. Я решил это, используя статическое свойство. Возможно, это связано с проблемой выше.

Я хотел бы понять, что я ошибаюсь, чтобы это событие PropertyChanged работало правильно.

Всего 1 ответ


Хорошо, я понял, как это решить. В принципе, я создал свойство с private static event полем 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 полем 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; }
}

как я показал выше.


Есть идеи?

10000