我有一个WPF应用程序,其中UI元素绑定到DataServiceCollection<File>
。在用户界面中,用户将对集合中的每个File
执行一次某些操作。因此,最初并不需要所有File
对象。
由于集合很大,因此加载所有元素需要很长时间。我想要的是首先将少数File
个对象加载到集合中,然后启动一个过程以在不阻塞UI的情况下在后台加载其余对象。
最初,我的MainWindow
这样设置DataContext
:
DataContext = new MyContext();
通过类型为MyInterface
的实例(这是同一解决方案中类库项目中的一个类),我加载了第一批File
对象:
public class MyContext {
public DataServiceCollection<File> AllFiles { get; set; }
public MyInterface Interface { get; set; }
public MyContext() {
AllFiles = Interface.LoadHandful();
}
}
...
public class MyInterface {
private ODataService DataService { get; set; } // ODataService inhertits DataServiceContext
public DataServiceCollection<File> LoadHandful() {
var q = DataService.Files.Where(..some predicate here..); // DataService is a property of type OData
return new DataServiceCollection<File>(q.Take(5));
}
}
我现在理想的是LoadRestAsync()
类中的另一种方法MyInterface
,它将异步加载剩余的File
对象,而不会阻塞UI,因此用户可以开始处理带有第一批File对象,而其余对象正在加载。
我尝试将LoadAsync
方法与LoadCompleted
事件结合使用。我也尝试过LoadNextPartialSetAsync
函数,但无济于事。我也尝试过this thread中描述的方法,但是不确定我是否真正掌握了代码。我试图从几年的中断中恢复使用C#,与此同时,我注意到了很多变化。
下面是我目前的看法,但以下是我的例外情况。
public void LoadRestAsync(DataServiceCollection<File> target, Expression<Func<File, bool>> predicate) {
var q = DataService.Files.Where(predicate);
DataServiceCollection<File> result = new DataServiceCollection<File>(q);
result.LoadCompleted += (sender, args) => {
Console.WriteLine("Finished LoadRestAsync");
target = result;
};
result.LoadAsync();
}
我在result.LoadAsync()
语句中收到以下异常:
System.InvalidOperationException: 'The LoadAsync method cannot be called when the DataServiceCollection is not a child collection of a related entity.'