2015-10-10 4 views
1

У меня есть кнопка «Закрыть» и Expander связаны с моей точки зрения MVVM так:ReactiveUI: R/W свойства против вывода Свойства

this.BindCommand(ViewModel, vm => vm.CloseResults, v => v.CloseButton); 
this.OneWayBind(ViewModel, vm => vm.HasExecuted, v => v.Panel.IsExpanded); 

Если пользователь нажимает на кнопку, расширитель должен быть разрушилась. В модели представления, у меня есть ReactiveCommand, которые должны заботиться об этом:

public ReactiveCommand<object> CloseResults { get; protected set; } = 
    ReactiveCommand.Create(); 

В модели представления, HasExecuted является выход недвижимости, который предполагается развернуть/свернуть расширитель в зависимости от его значения:

private readonly ObservableAsPropertyHelper<bool> _hasExecuted; 
public bool HasExecuted => _hasExecuted.Value; 

так подключить команду с помощью кнопки, я привязки HasExecuted к команде, как так:

CloseResults.Select(_ => false).ToProperty(this, vm => vm.HasExecuted, out _hasExecuted); 

Это, кажется, не делать nything. Однако, если я использую свойство read-write вместо этого и подключаю его следующим образом:

CloseResults.Subscribe(_ => { HasExecuted = false; }); 

он отлично работает. Может ли кто-нибудь объяснить, почему свойство Output не работает в этом случае? Разве не расширение ToProperty должно подписываться на IOberservable<bool>, что возвращается Select(_ => false)?

Я все еще посередине, чтобы получить все это, так что, возможно, что-то очевидное, что мне не хватает.

+0

Кажется, что HasExecuted наблюдается всегда будет ложным. Также вы не можете установить его, потому что он только для чтения. – kenny

+0

Ну, 'HasExecuted' ранее установлен в true, вот почему панель расширена в первую очередь. И только для чтения член является 'ObservableAsPropertyHelper ', а не сам bool? – phreezie

ответ

0

Свойства выхода предназначены для отражения состояния других свойств или наблюдаемых. Это в основном небольшая формула, которую вы пишете, которая дает свойство как результат. Вы не должны устанавливать их напрямую. См. the docs for this.

CloseResults.Select (_ => false) .ToProperty (это, vm => vm.HasExecuted, out _hasExecuted);

^Это не говорит "Независимо от того, что он дает CloseResults как выход, возвращать Observable, что всегда возвращает ложное"

CloseResults.Select (_ => ложь). ToProperty (это, vm => vm.HasExecuted, out _hasExecuted);

^Это говорит: «Возьмите это всегда ложное наблюдение и превратите его в свойство вывода HasExecuted».

Ваше свойство чтения/записи больше подходит для того, что вы пытаетесь сделать здесь.

Смежные вопросы