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

时间:2012-01-08 09:41:08

标签: silverlight mvvm mvvm-light system.reactive

我无法使用Reactive Extentions和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");

以下代码订阅了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线程。

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

这是因为您添加到Workspaces集合中,实际上并未再次设置集合属性。如果您已经使用过

Workspaces = new ObservableCollection<Workspace>();

然后触发了wokrspace属性的设置。现在它只使用已存在的值。如果你在getter中设置一个断点,它就会被击中。