使用Rx、MVVM Light和Silverlight无法返回UI线程



我无法使用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中设置断点,它将被命中。

相关内容

  • 没有找到相关文章

最新更新