2015-10-10 48 views
1

我有一個「關閉」按鈕,然後在我的MVVM視圖鏈接,像這樣一個ExpanderReactiveUI: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。但是,如果我使用讀寫屬性,並將其掛接如下:

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

它可以很好地工作。任何人都可以解釋爲什麼輸出屬性在這種情況下不起作用?是不是ToProperty擴展應該訂閱Select(_ => false)返回的IOberservable<bool>

我仍然處在所有這一切的中間,所以可能有一些明顯的我失蹤了。

+0

對我來說,似乎HasExecuted observable將永遠是錯誤的。你也不能設置它,因爲它是隻讀的。 – kenny

+0

那麼'HasExecuted'事先設置爲true,這就是面板擴展的原因。而只讀成員是'ObservableAsPropertyHelper ',而不是布爾本身? – phreezie

回答

0

輸出屬性旨在反映其他屬性或可觀察對象的狀態。這基本上是你寫的一個公式,它給出了一個屬性作爲輸出。你並不是想直接設置它們。見the docs for this

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

^這是說: 「不管是什麼CloseResults給它作爲一個輸出,返回一個可觀察的是始終返回false」

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

^這就是說:「把那個永遠是錯誤的Observable並把它變成HasExecuted輸出屬性。」

您的讀/寫屬性更適合您在此嘗試執行的操作。