【问题标题】:Fail to get back on the UI Thread using Rx, MVVM Light and Silverlight使用 Rx、MVVM Light 和 Silverlight 无法返回 UI 线程
【发布时间】:2012-01-08 09:41:07
【问题描述】:

我无法使用响应式扩展和 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&lt;Workspace&gt;,从我读到的.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 的设置器上设置断点时,它永远不会被击中,所以我怀疑 Observable 流没有返回到 UI 线程。

任何帮助将不胜感激。

【问题讨论】:

    标签: silverlight mvvm mvvm-light system.reactive


    【解决方案1】:

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

    Workspaces = new ObservableCollection<Workspace>();
    

    那么 wokrspace 属性的设置就会被触发。现在它只使用已经存在的值。如果您在 getter 中设置断点,它将被命中。

    【讨论】:

    • 你是对的!假设二传手会被击中,这是我的一个大错误。我感到困惑的原因是,当我在 ViewModel 的构造函数中执行 .Add 时,我具有所需的行为,但这是因为 UI 尚未绑定到该属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多