我无法使用Reactive Extensions和MVVM Light Toolkit返回UI线程。
我在ViewModel上得到了以下属性:
private ObservableCollection<Workspace> _workspaces;
public ObservableCollection<Workspace> Workspaces
{
get
{
return _workspaces;
}
set
{
if (_workspaces == value)
return;
_workspaces = value;
RaisePropertyChanged("WorkspacesLoaded");
}
}
public bool WorkspacesLoaded
{
get
{
if (_workspaces != null && _workspaces.Count > 0)
return true;
return false;
}
}
注意RaisePropertyChanged("WorkspacesLoaded");
,它似乎从未到达UI。
下面的代码订阅了Subject<Workspace>
,从我读到的.ObserveOnDispatcher()
应该会让我回到UI线程。
_workspaceSubscription = _workspaceSource.WorkspaceMutations
.ObserveOnDispatcher()
.SubscribeOn(Scheduler.ThreadPool)
.Subscribe(OnNewWorkspaceMutation, OnWorkspaceMutationError);
_workspaceSource.GetWorkspaces();
此代码添加到Workspaces
属性中:
private void OnWorkspaceCreated(Workspace workspace)
{
Workspaces.Add(workspace);
}
这就是让我困惑的地方:Workspaces
集合得到了正确的填充,UI也正确地绑定到了它。然而,当我在Workspaces
的setter上设置断点时,它永远不会被命中,所以我怀疑Observable流没有返回到UI线程。
如有任何帮助,我们将不胜感激。
这是因为添加到Workspaces集合中,实际上不会再次设置集合属性。如果您使用过
Workspaces = new ObservableCollection<Workspace>();
那么wokrspace属性的设置就会被触发。现在它只使用已经存在的值。如果在getter中设置断点,它将被命中。