我首先尝试了其他方法:
这些方法有效,但是我仍然不得不混淆模型中所有属性的访问器方法,或者使用dynamic 对象,这会在编码时杀死你的自动完成。值得一提的是,不幸的是,WinForms 不支持绑定到动态对象。
解决方案
最后我遇到了ReactiveUI.Fody。这是一个使用 Fody 和 ReactiveUI 的简单易用的解决方案。我在我的 WPF 项目中成功使用了它。
它在编译时编入所需的样板代码RaisePropertyChanges 和ObservableAsPropertyHelper。
项目依赖
https://github.com/kswoll/ReactiveUI.Fody
我使用 NuGet 在我的项目中安装了以下软件包:
<packages>
<package id="Fody" version="2.0.7" targetFramework="net452" developmentDependency="true" />
<package id="reactiveui" version="7.4.0" targetFramework="net452" />
<package id="ReactiveUI.Fody" version="2.2.11" targetFramework="net452" />
<package id="reactiveui-core" version="7.4.0" targetFramework="net452" />
<package id="Rx-Core" version="2.2.5" targetFramework="net452" />
<package id="Rx-Interfaces" version="2.2.5" targetFramework="net452" />
<package id="Rx-Linq" version="2.2.5" targetFramework="net452" />
<package id="Rx-Main" version="2.2.5" targetFramework="net452" />
<package id="Rx-PlatformServices" version="2.2.5" targetFramework="net452" />
<package id="Rx-XAML" version="2.2.5" targetFramework="net452" />
<package id="Splat" version="1.6.0" targetFramework="net452" />
</packages>
福迪设置
您需要在项目的顶层创建一个 FodyWeavers.xml 文件,如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
<ReactiveUI/>
</Weavers>
用法
您只需将模型类设置为继承 ReactiveObject 并添加
[Reactive] 属性高于您要通知更改的任何属性。
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
namespace name.domain.some{
class SomeClass : ReactiveObject {
[Reactive]
public string SomeProperty { get; set; }
}
}
工作完成!重建您的项目并检查 Visual Studio 中的输出窗口。当 Fody 处理带注释的模型类并注入适当的样板代码时,您应该会看到从 Fody 输出的一些行。它应该看起来像这样:
更多信息
更多有用的信息可以在here找到。