ReactiveUI: использование CanExecute с ReactiveCommand
Я начинаю работать со структурой ReactiveUI в проекте Silverlight и мне нужна помощь в работе с 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
чтобы он автоматически переоценивался в этой ситуации?
2 ответа
На самом деле, есть лучший способ сделать это, заменив 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");
}
}