gpt4 book ai didi

c# - 可观察的集合更改不会从后台在 UI 上更新,但普通属性会收到通知

转载 作者:太空狗 更新时间:2023-10-29 22:30:56 26 4
gpt4 key购买 nike

我有两个类(class)

public class ConccClass<T> : ObservableCollection<T>
{
}

public class TestTherad: INotifyPropertyChanged
{
private string name;
public string Name
{ get {
return name;
}
set
{
if (value != name)
{
name = value;
RaisePropertyChanged("Name");
}
}
}
//// the notification implemented fully here
}

现在我已经在我的 View 模型中创建了一个“ConccClass”集合,并将其与 View 中 xaml 上的数据网格绑定(bind)。

问题当我在没有任何分派(dispatch)器的情况下在后台线程上添加一个项目时,它不会反射(reflect)在数据网格中。表示没有添加项目。为此,我必须在 Dispatcher 中添加项目。开始调用。这对我来说很有意义。

但是要更新任何项目的名称我不需要调度程序。

Task.Factory.StartNew(() =>
{
while (true)
{
Thread.Sleep(100);
{
this.Dispatcher.Invoke(() => this.Coll.Add(new TestTherad())); // **Works well**
//this.Coll.Add(new TestTherad()); // **does not work at all.**
this.Coll[0].Name = r.Next().ToString(); // ** without dispatcher works well.**
}
}
});

为什么会有这样的行为?

最佳答案

下面是一个简短的解释:

您可能将一个 UI 元素绑定(bind)到可观察集合。当您将元素添加到可观察集合时,UI 会更新以反射(reflect)更改。但是,唯一允许更改 UI 的线程是主线程。

因此,当您使用后台线程将项目添加到可观察集合时,UI 会尝试使用后台线程进行更新,不允许对 UI 进行更改,并抛出异常。

我很确定这一行应该抛出异常://this.Coll.Add(new TestTherad());。尝试在任务 block 内进行调试。

当您使用调度程序时,您是在使用主线程进行更新,因此它可以正常工作。

属性更新有效,因为您只是引发了一个事件。框架应该监听该事件并确保自动将其分派(dispatch)到主线程。

关于c# - 可观察的集合更改不会从后台在 UI 上更新,但普通属性会收到通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26731974/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com