2011-07-19 41 views
2

我開始在Silverlight項目中使用ReactiveUI框架,並需要使用ReactiveCommands的一些幫助。ReactiveUI:將CanExecute與ReactiveCommand一起使用

在我看來模型中,我有一些看起來大致是這樣的(這只是一個簡單的例子):

public class MyViewModel : ReactiveObject 
{ 
    private int MaxRecords = 5; 

    public ReactiveCommand AddNewRecord { get; protected set; } 

    private ObservableCollection<string> _myCollection = new ObservableCollection<string>(); 
    public ObservableCollection<string> MyCollection 
    { 
    get 
    { 
     return _myCollection; 
    } 

    set 
    { 
     _myCollection = value; 
     raiseCollectionChanged("MyCollection"); 
    } 
    } 

    MyViewModel() 
    { 
    var canAddRecords = Observable.Return<bool>(MyCollection.Count < MaxRecords); 
    AddNewRecord = new ReactiveCommand(canAddRecords); 

    AddNewRecord.Subscribe(x => 
    { 
     MyCollection.Add("foo"); 
    } 
    } 
} 

canAddRecords功能得到評估的第一次創建ReactiveCommand,但它不是當項目被添加到MyCollection時得到重新評估。任何人都可以告訴我一個很好的例子,說明如何綁定ReactiveCommandcanExecute屬性,以便在這種情況下自動重新評估它。

回答

5

其實,有一個更好的方式來做到這一點,改變你的ObservableCollection到ReactiveCollection(從的ObservableCollection繼承,但增加了一些額外的屬性):

MyCollection = new ReactiveCollection<string>(); 

AddNewRecord = new ReactiveCommand(
    MyCollection.CollectionCountChanged.Select(count => count < MaxRecords)); 

現在這裏美中不足的是,雖然,你可以't 覆蓋 MyCollection,只重新填充它(即清除()+添加())。讓我知道如果這是一個破壞者,還有一種方法可以解決這個問題,儘管這需要更多的工作。

+1

我唯一的其他要求是我需要Observable集合中的記錄不斷按3個不同的字段排序。因此,當添加新記錄時,收藏會自動重新排序。但我不確定這是一個完全不同的問題。 –

+1

你能解釋爲什麼這種方法更好嗎?我不是在批評,我只是剛接觸Reactive,任何其他信息都會有所幫助。 –

+1

因此,當您使用.Create時,它就像RelayCommand - 必須由Silverlight調查CanExecute。使用正常的構造函數意味着隨着收集計數的改變,*很快*,CanExecute會立即得到正確更新(通過CanExecuteChanged)和按鈕灰色/非固定。 –

3

我終於想出了這一個。使用ReactiveCommand.Create()適合我的情況。

MyViewModel() 
{ 
    AddNewRecord = ReactiveCommand.Create(x => MyCollection.Count < MaxRecords); 

    AddNewRecord.Subscribe(x => 
    { 
    MyCollection.Add("foo"); 
    } 
} 
相關問題