我有一个MVVM应用程序,其中需要将模型层中的状态更改传递给视图,并且在视图中需要在模型层中进一步处理之前同步对状态更改执行操作。
特定场景涉及模型和视图共享的COM对象(作为构建可怕遗留架构的结果),模型需要在共享COM对象上执行Marshal.ReleaseComObject,但视图需要事先释放它对COM对象的引用(否则RCW将失效,并且此特定视图组件背后的本机实现将剧烈爆炸)。
我用来实现此功能的机制是将视图上的依赖项属性数据绑定到模型上的属性,viewmodel层会中继此更改通知。模型层和viewmodel层都实现了必要的INotifyPropertyChanged接口以支持绑定。在视图中,依赖属性向附加PropertyChanged处理程序的PropertyMetadata实例注册。
我发现的问题是我的PropertyChanged处理程序没有被同步调用。当我在模型中触发PropertyChanged事件时,它被正确地转发到视图绑定到的属性,但此时不会触发依赖属性PropertyChanged事件。稍后几行代码模型调用Marshal.ReleaseComObject,然后在该调用内部,在相同的(主UI)线程上调用依赖属性PropertyChanged事件。
在我看来,非常像绑定是将依赖属性PropertyChange调用发布到消息循环,而对ReleaseComObject的调用导致消息循环处理该消息。
经过一个早上的研究,我没有发现什么可以解释为什么会发生这种情况。在绑定上设置IsAsync = false也没有效果。
我已经有了一个可接受的问题解决方法,但我真的很想了解这里发生了什么。有谁知道这里发生了什么或有类似行为的经历?