所以我有这个对象:
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 特定的(也称为视图模型),那么尽快created在 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
通过构造函数。
另一种方法是保持对象完整,但数据通过中间同步绑定源绑定到它,如此处所述通过单独的任务更新 BindingSource 中的元素 https://stackoverflow.com/questions/32885552/update-elements-in-bindingsource-via-separate-task/32886415#32886415.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)