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