从另一个 class 更新 ObservableCollection
Updating ObservableCollection from another class
我有一个绑定到 DataGrid 的 ObservableCollection。我想更新另一个 class 中的集合,运行 是一个异步函数。目前,当我尝试正常添加它时,出现错误:This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread
。阅读许多建议使用 BindingOperations.EnableCollectionSynchronization
的其他问题,但我不知道如何实现它,而且我无法从另一个 class 中找到 运行 的任何示例。这是更新集合的正确方法吗,因为它们会非常频繁地更新,或者有更好的方法吗?
至于代码,Main class:
public DataStore dataStore = new DataStore();
public MainWindow() {
InitializeComponent();
requestView.ItemsSource = dataStore.requestData;
responseView.ItemsSource = dataStore.responseData;
DataRetriver drt = new DataRetriver(dataStore);
}
和检索数据的class:
public class DataRetriver
{
DataStore localStore;
public BidAskDataRetriver(DataStore ds)
{
this.localStore = ds;
runA();
}
public void runA()
{
//Build listener
listener.Bind("data", (dynamic data) => {
//data = json
parseData(data);
});
}
parseData(dynamic data)
{
//parse data and make a list with items for collection
foreach(myClass item in items)
localStore.requestData.Add(item);
}
}
您可以使用 Dispatcher 来执行此操作。要使用调度程序,您必须保留一个 Dispatcher 实例。例如,您可以像这样通过 class 构造函数发送 UI 调度程序并将其存储在 "dispatcher":
DataRetriver drt = new DataRetriver(dataStore, requestView.Dispatcher);
然后下面的代码将完成这项工作,但知道这一点,Dispatcher tasks 运行 on UI thread 因此,您发送给 Dispatcher 的操作越多,您在不同的地方做事的后台进程就越少线程用处不大。因此,您可能会考虑在后台的另一个对象中创建您的列表,并一步将其设置为原始对象(而不是在循环中)。
parseData(dynamic data)
{
//parse data and make a list with items for collection
foreach(myClass item in items)
{
dispatcher.Invoke(()=>{
localStore.requestData.Add(item);
});
}
}
我有一个绑定到 DataGrid 的 ObservableCollection。我想更新另一个 class 中的集合,运行 是一个异步函数。目前,当我尝试正常添加它时,出现错误:This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread
。阅读许多建议使用 BindingOperations.EnableCollectionSynchronization
的其他问题,但我不知道如何实现它,而且我无法从另一个 class 中找到 运行 的任何示例。这是更新集合的正确方法吗,因为它们会非常频繁地更新,或者有更好的方法吗?
至于代码,Main class:
public DataStore dataStore = new DataStore();
public MainWindow() {
InitializeComponent();
requestView.ItemsSource = dataStore.requestData;
responseView.ItemsSource = dataStore.responseData;
DataRetriver drt = new DataRetriver(dataStore);
}
和检索数据的class:
public class DataRetriver
{
DataStore localStore;
public BidAskDataRetriver(DataStore ds)
{
this.localStore = ds;
runA();
}
public void runA()
{
//Build listener
listener.Bind("data", (dynamic data) => {
//data = json
parseData(data);
});
}
parseData(dynamic data)
{
//parse data and make a list with items for collection
foreach(myClass item in items)
localStore.requestData.Add(item);
}
}
您可以使用 Dispatcher 来执行此操作。要使用调度程序,您必须保留一个 Dispatcher 实例。例如,您可以像这样通过 class 构造函数发送 UI 调度程序并将其存储在 "dispatcher":
DataRetriver drt = new DataRetriver(dataStore, requestView.Dispatcher);
然后下面的代码将完成这项工作,但知道这一点,Dispatcher tasks 运行 on UI thread 因此,您发送给 Dispatcher 的操作越多,您在不同的地方做事的后台进程就越少线程用处不大。因此,您可能会考虑在后台的另一个对象中创建您的列表,并一步将其设置为原始对象(而不是在循环中)。
parseData(dynamic data)
{
//parse data and make a list with items for collection
foreach(myClass item in items)
{
dispatcher.Invoke(()=>{
localStore.requestData.Add(item);
});
}
}