Не удается вернуться в поток пользовательского интерфейса, используя Rx, MVVM Light и Silverlight - PullRequest
0 голосов
/ 08 января 2012

Мне не удается вернуться к потоку пользовательского интерфейса с помощью Reactive Extentions и MVVM Light Toolkit.

Я получил следующие свойства в 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() должно вернуть меня в поток пользовательского интерфейса.

        _workspaceSubscription = _workspaceSource.WorkspaceMutations
            .ObserveOnDispatcher()
            .SubscribeOn(Scheduler.ThreadPool)
            .Subscribe(OnNewWorkspaceMutation, OnWorkspaceMutationError);

        _workspaceSource.GetWorkspaces();

И этот код добавляет к свойству Workspaces:

    private void OnWorkspaceCreated(Workspace workspace)
    {
       Workspaces.Add(workspace);
    }

Это то, что сбивает меня с толку: коллекция Workspaces заполняется правильно, а пользовательский интерфейс привязывается к ней правильно.Однако, когда я устанавливаю точку останова на установщик Workspaces, он никогда не срабатывает, поэтому я подозреваю, что поток Observable не возвращается в поток пользовательского интерфейса.

Любая помощь будет высоко оценена.

1 Ответ

1 голос
/ 08 января 2012

Это потому, что вы добавляете в коллекцию Workspaces, вы фактически не устанавливаете свойство коллекции снова. Если вы использовали

Workspaces = new ObservableCollection<Workspace>();

тогда установка свойства wokrspace была бы запущена. Теперь он просто использует значение, которое уже есть. Если вы установите точку останова в геттере, она будет достигнута.

...