如何在AvaloniaUI中创建带自定义getter/setter的ReactiveUI ViewModel属性?
解决ReactiveUI.Fody中带自定义getter/setter的[Reactive]属性编译错误
问题原因
ReactiveUI.Fody的[Reactive]特性是为自动属性设计的,用于自动生成后台字段和INotifyPropertyChanged逻辑。当你为属性编写自定义getter/setter时,Fody的织入器无法正确识别属性与后台字段的关联逻辑,从而抛出Sequence contains more than one matching element异常。
解决方案
移除属性上的[Reactive]特性,手动实现ReactiveUI的属性变更通知逻辑。确保你的类继承自ReactiveUI的ReactiveObject基类(内置属性变更通知实现),直接调用基类方法触发通知即可。
修改后的代码示例
class SomeValueClass : IValue {} // 确保业务类继承自ReactiveObject class YourClass : ReactiveObject { private IValue? ValueStubFoo; private IValue? ValueStub; public IValue? CustomValue { get { if (ValueStub is null) { if (ValueStubFoo is SomeValueClass valueStub) { // 延迟初始化并克隆实例 ValueStub = valueStub.Clone(); // 通知UI属性值已变更 RaisePropertyChanged(nameof(CustomValue)); } } return ValueStub; } set { // 使用RaiseAndSetIfChanged简化值检查与通知 if (RaiseAndSetIfChanged(ref ValueStub, value)) { // 可选:值变更后的额外逻辑 } } } }
关键说明
- 移除
[Reactive]特性:避免Fody织入器处理自定义访问器时产生冲突。 RaiseAndSetIfChanged方法:ReactiveObject基类提供的便捷方法,自动检查值是否变化,若变化则更新字段并触发PropertyChanged事件。- getter中的通知:由于getter包含延迟初始化逻辑,当
ValueStub从null被赋值为克隆实例时,需手动调用RaisePropertyChanged通知UI更新。
内容的提问来源于stack exchange,提问作者JohnB
相关产品推荐
相关产品推荐

