gpt4 book ai didi

c# - 当从另一个线程修改对象属性时引发 OnPropertyChanged

转载 作者:行者123 更新时间:2023-11-30 19:24:30 24 4
gpt4 key购买 nike

所以我有这个对象:

public class SomeObject: INotifyPropertyChanged
{
public decimal AlertLevel {
get {
return alertLevel;
}
set {
if(alertLevel == value) return;
alertLevel = value;
OnPropertyChanged("AlertLevel");
}

private void OnPropertyChanged(string propertyName) {
if(PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}

假设我在非 GUI 线程的线程上更改此对象。当我没有对此类中任何 GUI 组件的引用时,如何让此对象在与 GUI 相同的线程上引发 PropertyChanged 事件?

最佳答案

通常情况下,事件订阅者应负责在必要时编码对 UI 线程的调用。

但如果所讨论的类是特定于 UI 的(也称为 View 模型),一旦它在 UI 线程上创建,您就可以捕获 SynchronizationContext 并使用它引发这样的事件:

public class SomeObject : INotifyPropertyChanged
{
private SynchronizationContext syncContext;

public SomeObject()
{
syncContext = SynchronizationContext.Current;
}

private decimal alertLevel;

public decimal AlertLevel
{
get { return alertLevel; }
set
{
if (alertLevel == value) return;
alertLevel = value;
OnPropertyChanged("AlertLevel");
}
}

public event PropertyChangedEventHandler PropertyChanged;

private void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
if (syncContext != null)
syncContext.Post(_ => handler(this, new PropertyChangedEventArgs(propertyName)), null);
else
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}

或者,您可以通过构造函数传递 SynchronizationContext

另一种方法是保持对象完好无损,但数据通过中间同步绑定(bind)源绑定(bind)到它,如此处所述Update elements in BindingSource via separate task .

关于c# - 当从另一个线程修改对象属性时引发 OnPropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35901454/

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