使用ReactiveUI 前端绑定不生效

问题描述:

新建了一个自定义控件,叫 PortPage,还有它对应的PortPageViewModel

我在一个父窗体 MachineControl 中,想保存一个PortPageViewModel类型的属性,属性的定义是下面这样

xaml中这样写,直接把PortPage当成控件:

然后在的窗体代码 MachineControl.xaml.cs中实现绑定这个用户控件的数据绑定;

PortPage.xaml.cs定义如下,因为使用了ReactiveUI框架,继承了IViewFor<PortPageViewModel>接口,所以他有PortPageViewModel类型的ViewModel属性。

运行起来之后发现在用户控件上,按钮的命令是绑定状态,但是像DataGrid,TextBox这类控件并没有绑定效果

它们的区别是:命令的绑定我是通过后端代码实现:

控件的绑定我是通过在前端指定:

出现这种前端绑定失效问题首先应该联想到窗体的DataContext属性有没有正确设置;

解决办法:
尝试1:

很遗憾,在前端尝试指定DataContext属性并没有解决这个问题:

查阅资料后,知道通过d:DataContext 只在 设计器(Visual Studio Designer) 中生效,在运行时完全不起作用。

  • d:DataContext 只影响设计器,不影响运行时
尝试2:

这种方法运行后看似可以绑定,但是我发现他会进入PortPageViewModel的构造函数两次第一次是在父窗体中的实例化,

第二次是在PortPage控件的初始化方法中:

这就有一个新的问题,我界面上的DataGrid,TextBox这类控件到底绑定了哪一个ViewModel;

为了验证,我在PortPageViewModel中添加了一个string类型的test字段;然后在构造函数中设置为"ctor":

并且第一次new PortPageViewModel之后,把test赋值为"new";

这样就满足了第一个VM的test是"new",第二个VM的test是"ctor";

然后在PortPage的构造函数,绑定按钮命令前添加了以下两行代码,用于获取前端控件绑定的ViewModel的 test属性;运行结果如下:

说明了前端容器控件和前端按钮绑定了两个不同的VewModel,分别是我上面所提到的两个PortPageViewModel对象。

这个尝试也不行;

尝试3:

然后查阅资料后,通过下面的方法指定可以实现正常绑定:

在给用户控件的ViewModel属性赋值时,顺便在后端设置DataContext属性;

验证如下:

而这又引出一个新问题:关于DataContext的设置方式的区别

未完,或者新写一篇文章。得闲研究

相关推荐
深澈Vincel1 小时前
我用 C# + WebView2 做了一个针对“流氓软件”的“一键清理工具“:架构实践与踩坑记录
c#
zlinear数据采集卡2 小时前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#
阿部多瑞 ABU3 小时前
告别手工核图:基于 .NET + MuPDFCore 的 CAD 等轴测 PDF 材料表提取与新旧版本对比实战
后端·算法·ui·pdf·c#
条形码D4 小时前
DRG综合管理分析系统-目前已经支持CHS-DRG3.0
c#·drg·3.0分组器·drg分组器·chs-drg3.0分组器
Alex Gram1 天前
数据库同步工具PanguSync图文教程
java·mysql·postgresql·sqlserver·c#·数据库同步软件·数据库同步工具
头茬韭菜1 天前
第 10 篇:「Fluss 实战案例集」—— 完整解决方案与最佳实践
c#·linq·fluss
淡海水1 天前
01-05-运行时-JIT优化全景-内联去虚拟化边界检查消除
windows·c#·虚拟化·jit·内联·边界检查消除
波波0072 天前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
wujian83112 天前
怎么用千问生成word文档:从「格式崩」到「一键过」,AI导出鸭打通最后半厘米
人工智能·ai·c#·word·豆包·deepseek·ai导出鸭
zlinear数据采集卡2 天前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#