记录一次附加属性失效全过程

news/2025/9/24 6:35:31/文章来源:https://www.cnblogs.com/guchen33/p/19108469

1、我为了实现View到ViewModel的自动绑定,写了附加属性

local:ViewModelSelector.AutoWireViewModel="True"

没想到它不触发,我将dll的触发属性迁移到本地项目,触发了,但是报错MainViewModel找不到Text
2、我的xaml构造如下
MainView:

<Grid><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><Button Width="200" Content="{Binding Name}" /><ContentControl Grid.Column="1" Content="{Binding View}" />
</Grid>

HomeView:

 td:ViewModelSelector.AutoWireViewModel="True"
<StackPanel><TextBlock Text="{Binding Text}" />
</StackPanel>

此时发现附加属性触发,但是viewModelType为null,
打断点尝试,发现ViewModel没有注册,
注册完成后运行,失败,原来在同一目录去查找了
继续修改,将View和ViewModel替换

var name = view.GetType().FullName.Replace("View", "ViewModel");
var viewModelType = Type.GetType(name);
if (viewModelType != null)
{var viewModel = TangdaoApplication.Provider.GetService(viewModelType);view.DataContext = viewModel;
}

继续运行,
界面已经能出现 “World” → HomeView.DataContext 确实是 HomeViewModel,绑定完全正确。
但 VS 依旧报 “MainViewModel 上找不到 Text” → 说明有一处绑定表达式并没有指向 HomeViewModel,而是指到了 MainViewModel;运行期只是碰巧在 HomeView 区域看见了正确的值
此时我使用PresentationTraceSources.TraceLevel=High炸出所有报错
我怀疑附加属性运行了两次
我使用

 view.ClearValue(FrameworkElement.DataContextProperty); 

切断继承链并延迟到Initialized去触发,成功了
成功,此时打包代码到dll,继续使用dll执行。
把完全相同的代码从 EXE 项目搬到 DLL 后,又出现 “MainViewModel 找不到 Text”
没触发???为此,我对dll的附加属性类所有行打上断点
继续运行
还是没触发???
我添加代码

 public HomeView(){InitializeComponent();bool flag = IT.Tangdao.Framework.Selectors.ViewModelSelector.GetAutoWireViewModel(this);System.Diagnostics.Debug.WriteLine($"[HomeView] AutoWireViewModel={flag}");}

是true,但是为什么不进断点
为什么附加属性不触发,我使用System.Diagnostics.Debugger.Break();强制进断点
可以进去,现在我怀疑是JIT问题

 // 1. 显式静态构造static ViewModelSelector(){// 2. 强制触摸字段,防止 JIT 死代码消除var dummy = AutoWireViewModelProperty;}

还是不起作用出现 “MainViewModel 找不到 Text”
上火了,我将能打断点的可疑地方全部上断点
直到

  private HomeView _view;public HomeView View{get => _view;set => SetProperty(ref _view, value);}

get方法卡死,导致VS2022卡出去,吆喝,来活了
我现在怀疑HomeView 实例并不是由 XAML 解析器创建的,

 View = TangdaoApplication.Provider.GetService<HomeView>();

我检查我的IOC容器,测压多次应该没问题,那么我对IOC容器解析没问题
但是以防万一,我将解析改为new,new HomeView()
还是卡死,此时
我改为从ViewModel先行

 private HomeViewModel _view;public HomeViewModel View{get => _view;set => SetProperty(ref _view, value);}View = TangdaoApplication.Provider.GetService<HomeViewModel>();

加上数据模板

  <DataTemplate DataType="{x:Type vm:HomeViewModel}"><view:HomeView /></DataTemplate>

此时不报错,界面成功出现数据

这是因为
代码 new 视图 + SetProperty 触发属性通知 → 设计器反复创建 → 递归死循环
这是 View-First 最典型的“设计时炸弹”,无论 new HomeView() 还是 IOC 解析 HomeView,只要视图由代码实例化并塞进属性通知链路,都会中招;
ViewModel-First 天然免疫,因为 XAML 解析器只在需要呈现时才创建视图,永远不会递归触发属性通知。

阶段 环境 现象 关键发现
初期调试 EXE 项目 附加属性不触发 代码在本地可调试
中期迁移 DLL 迁移 附加属性完全失效 静态构造函数可能被优化
架构调整 View-First 设计时递归卡死 new HomeView() 导致属性通知循环
最终方案 ViewModel-First 运行正常 数据模板 + IOC 容器解析
维度 View-First 模式 ViewModel-First 模式
实例化时机 代码中显式 new 或 IOC 解析 XAML 解析器按需创建
设计时支持 容易递归卡死 VS 天然免疫设计时问题
数据绑定 容易受继承污染 数据模板明确关联
内存管理 可能重复创建视图 按需创建,生命周期清晰
调试难度 高(属性通知循环) 低(清晰的创建链路)

最后总结一句话
“在 WPF 里,视图 new 得越少,世界越干净;
把 new 交给 XAML,把逻辑交给 VM,把断点留给自己。”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/915091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wordpress重写插件公司的seo是什么意思

Geoffrey Hinton&#xff1a;深度学习之父的传奇人生与杰出贡献 在人工智能领域&#xff0c;有一位科学家的名字如同星辰般闪耀&#xff0c;他就是Geoffrey Hinton。作为深度学习的奠基人之一&#xff0c;Hinton的生涯充满了创新、突破和对未知的不懈探索。他的贡献不仅重塑了…

公司网站建设空间wordpress错误怎么解决

https://blog.csdn.net/weixin_30695195/article/details/95163683

南充能够建设网站的公司有山东住房与城乡建设网站

Vue Element UI 实现权限管理系统 前端篇&#xff08;三&#xff09;&#xff1a;工具模块封装 封装 axios 模块 封装背景 使用axios发起一个请求是比较简单的事情&#xff0c;但是axios没有进行封装复用&#xff0c;项目越来越大&#xff0c;会引起越来越多的代码冗余&am…

昆山网站建设是什么wordpress 外观自定义

postgresql-物化视图 物化视图创建物化视图刷新物化视图修改物化视图删除物化视图 物化视图 创建物化视图 postgresql使用create materialized view 语句创建视图 create materialized view if not exists name as query [with [NO] data];-- 创建一个包含员工统计信息的物化…

国家企业信用信息公示系统官网站广州的百度推广公司

文章目录一、实验目的二、实验要求三、实验内容1、通配符的使用2、重定向3、管道4、shell变量5、建立下面的脚本&#xff0c;运行并分析输出结果&#xff0c;并给出代码注释。6、编写脚本一、实验目的 1.为文件扩展名使用通配符 2.标准输入、标准输出和标准错误的重定向 3.使…

怎么提交网站地图aso优化公司

本周投稿推荐 SCI • 能源科学类&#xff0c;1.5-2.0&#xff08;25天来稿即录&#xff09; • CCF推荐&#xff0c;4.5-5.0&#xff08;2天见刊&#xff09; • 生物医学制药类&#xff08;2天逢投必中&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09…

什么是功能型网站郑州高端网站定制

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 在探索人工智能边界时&#xff0c;我们时常惊叹于人类孩童的学习能力 —— 可以轻易地将他人…

名表网站网站设计和经营

在 C 语言中&#xff0c;很多东西都是由我们自己去实现的&#xff0c;例如自定义数组&#xff0c;线程文件操作&#xff0c;排序算法等等&#xff0c;有些复杂的东西实现不好很容易留下不易发现的 bug。而 C为使用者提供了一套标准模板库 STL,其中封装了很多实用的容器&#xf…

收录网站工具淘宝运营去哪里学

java并发编程实战的解释&#xff0c;不够详细&#xff0c;尤其this引用逸出让人理解有些费解&#xff0c;java并发编程实战里面的内容就直接拷贝过来发布&#xff1a;使对象能够在当前作用域之外的代码中使用逸出&#xff1a;当某个不该被发布的对象被发布时&#xff0c;这种情…

番禺区怎么做网站建设凡科轻站小程序怎么样

转载自 哈工大刘挺教授&#xff1a;自然语言处理的十个发展趋势 近日&#xff0c;由中国人工智能学会、阿里巴巴集团 & 蚂蚁金服主办&#xff0c;CSDN、中国科学院自动化研究所承办的第三届中国人工智能大会&#xff08;CCAI 2017&#xff09;在杭州国际会议中心盛大开幕…

大学做机器人比赛的网站论坛用c 做的网站怎么打开

假如你的重复容器名称是mysql5 删除已存在的容器&#xff1a;如果你不再需要那个已经存在的名为“mysql5”的容器&#xff0c;你可以删除它。使用下面的命令&#xff1a; docker rm -f mysql5这条命令会强制删除正在运行的容器。一旦容器被删除&#xff0c;你就可以重新使用这个…

idea 做网站登录开网站做商城怎么样

并发编程的模型 并发编程需要解决的两个问题&#xff1a;线程之间如何同步&#xff0c;线程之间如何通信。 线程之间通信&#xff1a;共享内存&#xff0c;消息传递。 共享内存通过线程之间读-写程序的公共状态进行通信。消息传递要通过线程之间主动传递消息进行通信。 线程之间…

iis做网站ui设计的一般流程

感觉Redis变慢了&#xff0c;这些可能的原因你查了没 &#xff1f;(上) Redis 作为一款业内使用率最高的内存数据库&#xff0c;其拥有非常高的性能&#xff0c;单节点的QPS压测能达到18万以上。但也正因此如此&#xff0c;当应用访问 Redis 时&#xff0c;如果发现响应延迟变…

扬州做企业网站哪家公司好wordpress+作品展

TP-LINK 路由器忘记密码 - 恢复出厂设置 1. 恢复出厂设置2. 创建管理员密码3. 上网设置4. 无线设置5. TP-LINK ID6. 网络状态References 1. 恢复出厂设置 在设备通电的情况下&#xff0c;按住路由器背面的 Reset 按钮直到所有指示灯同时亮起后松开。 2. 创建管理员密码 3. 上网…

孝感个人网站建设大型网站seo

[css] IE(6/7/8/9/10/11/Edge)下的hack写法分别有哪些&#xff1f; IE9以及<IE9: \9;IE8以及>IE8: \0;3.IE7以及<IE7: *;4.IE6:*或_;5.edge不清楚;个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起…

安卓开发简单网站开发代码下载简单的电商网站

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1.概述2.设置属性 - …

网站开发 问题解决网站建设维护费用

题意&#xff1a;给出一些点&#xff0c;求最小的覆盖这些点的矩形的面积。 题解&#xff1a; 枚举下边界&#xff08;是一条边&#xff09;&#xff0c;然后暴力卡壳左右边界&#xff08;点&#xff09;&#xff0c;再暴力上边界&#xff08;点&#xff09;&#xff0c;更新答…

模具机械设备东莞网站建设企业营销型网站

子词嵌入 在英语中&#xff0c;“helps”“helped”和“helping”等单词都是同一个词“help”的变形形式。“dog”和“dogs”之间的关系与“cat”和“cats”之间的关系相同&#xff0c;“boy”和“boyfriend”之间的关系与“girl”和“girlfriend”之间的关系相同。在法语和西…

佛山网站建设工作网站在建设中页面

一、无人机巡检的优势 1. 高效性 覆盖范围广&#xff1a;可快速扫描大范围区域&#xff08;如电力线路、管道、农田等&#xff09;&#xff0c;尤其适合复杂地形&#xff08;山区、沼泽等&#xff09;。 速度快&#xff1a;飞行速度远高于人工巡检&#xff0c;缩短任务周期…

前端网站论文开个跨境电商要多少钱

Hadoop的演进从Hadoop 1到Hadoop 3主要是为了提供更高的效率、更好的资源管理、更高的可靠性以及对更多数据处理方式的支持。下面是Hadoop 1, Hadoop 2, 和 Hadoop 3之间的主要区别和演进的原因&#xff1a; Hadoop 1 特点&#xff1a; 主要包括两大核心组件&#xff1a;HDFS&a…