我有一个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有一个滚动条(垂直),第四个复选框始终默认隐藏,因为窗口尺寸较小,然后一旦我向下滚动以显示第四个复选框,它将在以后被检查!这真让我困惑,请帮忙。
答案 0 :(得分:1)
您使用的是VirtualizingStackPanel吗? I bet you are
您所描述的行为的原因是未更新的复选框实际上不存在(它不在列表框中)。滚动时会自动添加它,它会变得可见。
在这种情况下,您使用多个线程的事实并不相关。