Автоматическая привязка к некоторым свойствам сервиса в 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 и использовать вместо этого оболочку уведомлений?
1 ответ
В большинстве подходов сервисы не реализуют INotifyPropertyChanged (они не являются моделями), поэтому я рекомендую добавить ручные события:
public interface IDeviceManagerService
{
ISomeDeviceApi Api { get; }
event EventHandler<DeviceApiEventArgs> ApiChanged;
}
Таким образом, вы можете иметь дело с интересующим вас материалом (подписаться в InitializeAsync, отписаться в CloseAsync).