Автоматическая привязка к некоторым свойствам сервиса в Catel с Fody - PullRequest
0 голосов
/ 28 июня 2018

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

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 и использовать вместо этого уведомления wrapper ?

1 Ответ

0 голосов
/ 28 июня 2018

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

public interface IDeviceManagerService
{
    ISomeDeviceApi Api { get; }

    event EventHandler<DeviceApiEventArgs> ApiChanged;
}

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

...