2

Silverlight プロジェクトで ReactiveUI フレームワークの使用を開始していますが、ReactiveCommands の使用について助けが必要です。

私のビュー モデルでは、大まかに次のようなものがあります (これは単純化された例です)。

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。この状況で自動的に再評価されるように、のcanExecuteプロパティをバインドする方法の良い例を誰かに教えてもらえますか?ReactiveCommand

4

2 に答える 2

5

実際には、これを行うためのより良い方法があります。ObservableCollection を ReactiveCollection に変更します (ObservableCollection を継承しますが、いくつかのプロパティが追加されます)。

MyCollection = new ReactiveCollection<string>();

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

ただし、ここでの問題点は、MyCollection を上書きすることはできず、再作成 (つまり、Clear() + Add()) することだけです。それがディールブレーカーであるかどうか教えてください。もう少し手間がかかりますが、それを回避する方法もあります。

于 2011-07-20T01:49:29.493 に答える
3

私はついにこれを理解しました。使用ReactiveCommand.Create()は私の状況のた​​めに働いた。

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

  AddNewRecord.Subscribe(x => 
  {
     MyCollection.Add("foo");
  }
}
于 2011-07-20T00:42:21.570 に答える