首页 > 解决方案 > 使用 Fody 自动绑定到 Catel 中的某些服务属性

问题描述

假设有一些服务:

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 并使用通知包装器来代替?

标签: catelfodyfody-propertychanged

解决方案


在大多数方法中,服务不实现 INotifyPropertyChanged(它们不是模型),所以我的建议是添加手动事件:

public interface IDeviceManagerService
{
    ISomeDeviceApi Api { get; }

    event EventHandler<DeviceApiEventArgs> ApiChanged;
}

这样你就可以处理你感兴趣的东西(在 InitializeAsync 中订阅,在 CloseAsync 中取消订阅)。


推荐阅读