我开始在一个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
时,它没有被重新求值。谁能告诉我一个很好的例子,如何绑定ReactiveCommand
的canExecute
属性,以便在这种情况下自动重新评估?
实际上,有一个更好的方法来做到这一点,改变你的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");
}
}