UI没有反映从另一个线程触发的更改

时间:2014-03-04 10:48:41

标签: c# wpf multithreading

我有一个WPF应用程序,UI部分可以简单地理解为ListBox ItemsSource绑定到IList对象,假设IList对象实例是classInstances,而每个UI ListBox中的项只是一个复选框,IsChecked属性 2路绑定classInstances中的每个项目,更具体地说,绑定是在布尔属性AllowEntering上,然后我可以操纵AllowEntering来控制用户界面,就像每个WPF应用程序一样。

现在说classInstances有4个项目,所以ListBox中的4个复选框一样,所有4个复选框默认为未检查状态,然后我有一个 ThreadPool线程来及时扫描所有'AllowEntering'属性,如果它们是假的,那么将它设置为true,正如期望的那样,所有4个复选框都应该被检查,逻辑变得非常简单:

// we have 4 instance in a IList, each instance 2 way bind to a checkbox, of course 
//implement INotifyPropertyChanged
foreach (var oneInstance in classInstances)
{
    var safeInstance = oneInstance;
    ThreadPool.QueueUserWorkItem((o) =>
    {
        // start message handle loop
        while (true)
        {
            // 'AllowEntering' was bind to checkbox's 'IsChecked' property.
            if (safeInstance.AllowEntering == false)
            {
                // this should make the checkbox get checked!
                safeInstance.AllowEntering = true;
            }

            Thread.Sleep(5000);
        }
    });
}

问题是,有时最后一个复选框没有被检查,但其他人总是好,唯一不同的是listBox有一个滚动条(垂直),第四个复选框始终默认隐藏,因为窗口尺寸较小,然后一旦我向下滚动以显示第四个复选框,它将在以后被检查!这真让我困惑,请帮忙。

1 个答案:

答案 0 :(得分:1)

您使用的是VirtualizingStackPanel吗? I bet you are

您所描述的行为的原因是未更新的复选框实际上不存在(它不在列表框中)。滚动时会自动添加它,它会变得可见。

在这种情况下,您使用多个线程的事实并不相关。