ReactiveUI:使用CanExecute和一个ReactiveCommand



我开始在一个Silverlight项目中使用ReactiveUI框架,需要一些帮助来使用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属性,以便在这种情况下自动重新评估?

实际上,有一个更好的方法来做到这一点,改变你的ObservableCollection为ReactiveCollection(继承自ObservableCollection,但增加了一些额外的属性):

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

现在的问题是,你不能覆盖 MyCollection,只能重新填充它(即Clear() + Add())。如果这是一个问题,请告诉我,也有一种方法可以绕过它,尽管它需要更多的工作。

我终于弄明白了。使用ReactiveCommand.Create()对我的情况有效。

MyViewModel()
{
  AddNewRecord = ReactiveCommand.Create(x => MyCollection.Count < MaxRecords);
  AddNewRecord.Subscribe(x => 
  {
     MyCollection.Add("foo");
  }
}

相关内容

  • 没有找到相关文章

最新更新