刚刚发现一个有趣的 WPF 问题,我真的可以使用您的帮助:我有一个多级绑定(bind) Binding="{Binding PreviewItem.Status}
当且仅当从后台线程更新属性时才会产生奇怪的行为。我用了diagnostics:PresentationTraceSources.TraceLevel=High
并且似乎发生的情况是,如果状态被更新,它会阻止绑定(bind)在它之后的一瞬间实现整个 PreviewItem 更改!
我设法在一个新的空 C# 测试项目(VS 2012,.NET 4.5)中重现了该行为。这是主要代码:channel 和 TimelineItem 都是空类,只有一个属性具有所有适当的 notifypropertychanged 事件通知,StatusType 是一个 Enum,控件的 DataContext 设置为 _channel
:
Task.Run(() =>
{
if ( _channel.PreviewItem != null )
{
_channel.PreviewItem.Status = TimelineItem.StatusType.Default;
}
_channel.PreviewItem = new TimelineItem();
_channel.PreviewItem.Status = TimelineItem.StatusType.Preview;
});
}
假设我们这样做了三次以创建三个项目:
如果我 a) 将完全相同的代码移动到主线程或 b) 在更改旧项目状态之前分配新的 PreviewItem,则代码有效!不幸的是,我不能在我的项目中使用任何一种方法。
任何人都知道为什么这不起作用?据我了解,WPF 应该负责将更改事件分派(dispatch)给适当的调度程序。任何帮助都非常感谢...
亚历克斯
2014 年 8 月 4 日更新 #
由于某些奇怪的原因,该错误行为仅发生在 Windows 7 上。整个项目可以是 found here .
2014 年 9 月 2 日更新
问题已在修补程序中得到解决:http://support.microsoft.com/kb/2783808/en-us
最佳答案
您可以将您的 .Net 版本更新到 4.5.1/4.5.2 并重新检查吗?这可能是一个错误,可能已在最近的更新中修复。我仅在 Windows 7 机器上检查了您的代码,但无法重现它,因此它肯定与框架版本相关。
关于c# - WPF多级绑定(bind)线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25036509/