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。谁能告诉我一个很好的例子,说明如何绑定canExecutea 的属性,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 回答