c# - WPF多级绑定(bind)线程问题

标签 c# .net wpf multithreading binding

刚刚发现一个有趣的 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 被创建并分配给 PreviewItem,A 的状态变为“预览”(ok)
  • A 的状态变为默认,B 被创建并分配给 PreviewItem(失败,当状态更改时绑定(bind)仍然使用 A,更新到新状态并且永远不会重新绑定(bind)到 B!)
  • B 的状态变为默认,C 被创建并分配给 PreviewItem(好的,因为 A 的状态 - 绑定(bind)仍然被解析到 - 没有改变,因此它注意到 PreviewItem 已更改为 C)。

  • 如果我 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/

    相关文章:

    c# - 如何遍历对象的嵌套属性

    c# - 如何在 Lucene.NET 中删除复数?

    wpf - 打印窗口 WPF/DirectX

    c# - 无法在 C# 中访问类的非共享成员,但在 VB 中可以吗?

    c# - Bool 属性在未被调用的情况下设置为 true

    c# - BindAttribute 如何将数据库列绑定(bind)到程序中?

    c# - WPF 媒体元素的背景图像

    c# - 将 Mvvm Light 更新到版本 5 后,我需要做哪些更改才能使 RelayCommand CanExecute() 工作?

    c# - 如何以编程方式启动新的 Windows 登录 session (RDP 或控制台)

    c# - 如何使用 LINQ 更新数据库? Linq-to-SQL