使用 Fody 自动绑定到 Catel 中的某些服务属性
Automatic binding to some service properties in Catel with Fody
假设有一些服务:
public interface IDeviceManagerService
{
ISomeDeviceApi Api { get; }
}
它的目的是监控外部环境(USB,网络等),当检测到设备时实例化设备API,当设备不再是属性 null
可用。
假设有一个 view model 注入了这个服务,我想要 IDeviceManagerService.Api
的更改通知来使下面的事情成为可能(例如,有仅当设备 API 可用时才可用的按钮。
private Boolean OnSomeCommandCanExecute()
{
return _deviceManagerService.Api != null;
}
我想知道是否有一种干净的方法可以使这项工作无需手动更改通知处理(使用 Catel.Fody 或 PropertyChanged.Fody)。到目前为止,我已经设法通过从 ModelBase
派生的服务实现来获得工作结果,将其注入实例注册为视图模型中的 [Model]
并公开它的 Api
属性 使用[ViewModelToModel]
属性,但这是非常肮脏的方式。
是否有一些通用的方法,或者最好继续实施 INotifyPropertyChanged 并改用通知 wrapper?
在大多数方法中,服务不实现 INotifyPropertyChanged(它们不是模型),因此我的建议是添加手动事件:
public interface IDeviceManagerService
{
ISomeDeviceApi Api { get; }
event EventHandler<DeviceApiEventArgs> ApiChanged;
}
这样你就可以处理你感兴趣的东西了(在 InitializeAsync 中订阅,在 CloseAsync 中取消订阅)。
假设有一些服务:
public interface IDeviceManagerService
{
ISomeDeviceApi Api { get; }
}
它的目的是监控外部环境(USB,网络等),当检测到设备时实例化设备API,当设备不再是属性 null
可用。
假设有一个 view model 注入了这个服务,我想要 IDeviceManagerService.Api
的更改通知来使下面的事情成为可能(例如,有仅当设备 API 可用时才可用的按钮。
private Boolean OnSomeCommandCanExecute()
{
return _deviceManagerService.Api != null;
}
我想知道是否有一种干净的方法可以使这项工作无需手动更改通知处理(使用 Catel.Fody 或 PropertyChanged.Fody)。到目前为止,我已经设法通过从 ModelBase
派生的服务实现来获得工作结果,将其注入实例注册为视图模型中的 [Model]
并公开它的 Api
属性 使用[ViewModelToModel]
属性,但这是非常肮脏的方式。
是否有一些通用的方法,或者最好继续实施 INotifyPropertyChanged 并改用通知 wrapper?
在大多数方法中,服务不实现 INotifyPropertyChanged(它们不是模型),因此我的建议是添加手动事件:
public interface IDeviceManagerService
{
ISomeDeviceApi Api { get; }
event EventHandler<DeviceApiEventArgs> ApiChanged;
}
这样你就可以处理你感兴趣的东西了(在 InitializeAsync 中订阅,在 CloseAsync 中取消订阅)。