Wpf 奇怪的依赖性异步行为

Wpf 奇怪的依赖性异步行为,wpf,Wpf,我有一个MVVM应用程序,其中模型层中的状态更改需要传达给视图,并且在视图中,状态更改需要在模型层中进一步处理之前同步执行 特定场景涉及模型和视图共享的COM对象(作为在糟糕的遗留体系结构上构建的结果),模型需要在共享COM对象上执行Marshal.ReleaseComObject,但视图需要事先释放对COM对象的引用(否则RCW将无效,并且此特定视图组件背后的本机实现将剧烈爆炸) 我用来实现这一点的机制是将视图上的依赖项属性数据绑定到模型上的属性,viewmodel层转发此更改通知。模型层和v

我有一个MVVM应用程序,其中模型层中的状态更改需要传达给视图,并且在视图中,状态更改需要在模型层中进一步处理之前同步执行

特定场景涉及模型和视图共享的COM对象(作为在糟糕的遗留体系结构上构建的结果),模型需要在共享COM对象上执行Marshal.ReleaseComObject,但视图需要事先释放对COM对象的引用(否则RCW将无效,并且此特定视图组件背后的本机实现将剧烈爆炸)

我用来实现这一点的机制是将视图上的依赖项属性数据绑定到模型上的属性,viewmodel层转发此更改通知。模型层和viewmodel层都实现必要的INotifyPropertyChanged接口以支持绑定。在视图中,依赖项属性是registere与附加了PropertyChanged处理程序的PropertyMetadata实例一起创建

我发现的问题是我的PropertyChanged处理程序没有被同步调用。当我在模型中激发PropertyChanged事件时,它会正确地传递到视图绑定到的属性,但此时依赖属性PropertyChanged事件没有被激发。几行代码之后,模型调用Marshal.Rel然后在同一(主UI)线程上调用依赖属性PropertyChanged事件

在我看来,很像是绑定将依赖属性PropertyChange调用发布到消息循环中,而对ReleaseComObject的调用导致消息循环处理该消息

经过一个上午的研究,我没有发现任何东西可以解释为什么会发生这种情况。在绑定上设置IsAsync=false也没有效果


对于这个问题,我已经有了一个可以接受的解决方法,但我真的很想了解这里发生了什么。有人知道这里发生了什么或者有类似行为的经验吗?

您描述的行为可能是由于调用操作的时间不同。数据绑定有一个指定的优先级,这低于“正常”优先级。因此,所有与绑定相关的操作都会推迟到“正常”处理完成之后。但这段代码是单线程的,所以为什么要涉及调度程序,我不调用它?这只是一个模型层属性(在实现INotifyPropertyChanged的类上)绑定到视图上的依赖项属性,并使用属性元数据注册属性更改回调。并且当模型类触发其PropertyChanged事件时,不会调用属性更改回调。我未发现任何文档提及此过程中的任何固有异步性。可能相关:感谢poin我会调查的。