能否将文件查询返回的IReadOnlyList直接转换为ObservableCollection?
直接转换
IReadOnlyList<StorageFile>到ReadOnlyObservableCollection<StorageFile>不可行 直接强制转换的做法是行不通的,运行时会抛出InvalidCastException异常,原因很明确:queryResult.GetFilesAsync()返回的IReadOnlyList<StorageFile>实例,其具体实现(比如内部的List<StorageFile>或自定义集合类型)并不是ReadOnlyObservableCollection<T>的子类,两者没有继承关系,自然无法直接强制转换。
正确的实现方式
如果想要得到ReadOnlyObservableCollection<StorageFile>,你需要先把查询结果包装进一个ObservableCollection,再用它创建只读版本的包装类,代码示例如下:
public ReadOnlyObservableCollection<StorageFile> FileList; // 正确的转换流程 var rawFiles = await queryResult.GetFilesAsync(); var observableCollection = new ObservableCollection<StorageFile>(rawFiles); FileList = new ReadOnlyObservableCollection<StorageFile>(observableCollection);
补充说明
ReadOnlyObservableCollection<T>本质是对已有ObservableCollection<T>的只读包装,它不会自行存储数据,只是转发内部集合的变更通知,同时对外提供只读访问接口,因此必须先有一个可观察集合作为基础。- 你之前用
foreach循环加载到ObservableCollection的方式是可行的,但直接利用ObservableCollection的构造函数(支持传入任意IEnumerable<T>)会更简洁高效。
内容的提问来源于stack exchange,提问作者Brett JB
相关产品推荐
相关产品推荐

