目前我在MVVM项目中有两个类:
Presenter
的{{1}}类以及从ObservableCollection<T>
类加载的项目填充它的操作; Loader
类本身,其操作Loader
反序列化在给定目录中找到的文件。代码如下。
虽然文件加载是并行进行的,但是我只能在加载所有文件后填充ObservableCollection,这当然是一种糟糕的方法。
我的目标是将GetItems()
/ Populate
转换为在通话结束后立即返回的内容,并且加载的项目会弹出&#34;弹出&#34;在ObservableCollection中加载后立即加载。
我可以想到GetItems
,Parallel.ForEach
s事件的内容,但我不得不承认我已经完全失去了可能的选择。
IObservable
答案 0 :(得分:2)
这正是Rx(System.Reactive)有用的情况。
试试这个:
class Presenter
{
public ObservableCollection<TVM> ItemsVM { get; }
= new ObservableCollection<TVM>();
public Loader _loader
= new Loader(some_well_known_directory_path);
void Populate()
{
_loader
.GetItems()
.Subscribe(t_item => ItemsVM.Add(new TVM(t_item)));
}
}
}
class Loader
{
readonly string _path;
public Loader(string path)
{
_path = path;
}
public IObservable<T> GetItems()
{
return
Observable
.Defer(() =>
Directory
.EnumerateFiles(_path)
.ToObservable()
.SelectMany(fname => Observable.Start(() => T.Load(fname)));
}
}