Автоматическая привязка к некоторым свойствам сервиса в Catel с помощью Fody

Предполагая, что есть какой-то сервис:

public interface IDeviceManagerService
{
    ISomeDeviceApi Api { get; }
}

Его целью является мониторинг внешней среды (USB, сеть и т. д.), создание экземпляра API устройства при обнаружении устройства и создание свойства null, когда устройство больше недоступно.

Предположим, что существует модель просмотра с этой внедренной службой, я хотел бы иметь уведомления об изменениях для IDeviceManagerService.Api, чтобы сделать возможными такие вещи, как показано ниже (например, наличие кнопки, которая активна только тогда, когда доступен API устройства ).

private Boolean OnSomeCommandCanExecute()
{
    return _deviceManagerService.Api != null;
}

Интересно, есть ли чистый способ заставить это работать без ручной обработки уведомлений об изменениях (с помощью Catel.Fody или PropertyChanged.Fody). До сих пор мне удавалось получить рабочий результат, сделав реализацию службы производной от ModelBase, зарегистрировав внедренный экземпляр как [Model] внутри модели представления и выставив его свойство Api с использованием атрибута [ViewModelToModel], но это очень грязный способ.

Есть ли какой-то общий подход или было бы лучше реализовать INotifyPropertyChanged и использовать уведомления обертка?


person ArXen42    schedule 28.06.2018    source источник


Ответы (1)


В большинстве подходов службы не реализуют INotifyPropertyChanged (они не являются моделями), поэтому я рекомендую добавлять события вручную:

public interface IDeviceManagerService
{
    ISomeDeviceApi Api { get; }

    event EventHandler<DeviceApiEventArgs> ApiChanged;
}

Таким образом, вы можете иметь дело с интересующими вас вещами (подписаться в InitializeAsync, отписаться в CloseAsync).

person Geert van Horrik    schedule 28.06.2018
comment
Хорошо, кажется, что более явный и простой способ будет лучше, спасибо. - person ArXen42; 29.06.2018