ReactiveUI: использование CanExecute с ReactiveCommand - PullRequest
2 голосов
/ 20 июля 2011

Я начинаю работать с платформой 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 ]

5 голосов
/ 20 июля 2011

На самом деле, есть лучший способ сделать это, заменив ObservableCollection на ReactiveCollection (которая наследует от ObservableCollection, но добавляет некоторые дополнительные свойства):

MyCollection = new ReactiveCollection<string>();

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

Хотя здесь есть одна загвоздка, вы не можете перезаписать MyCollection, только заполнить его (т. Е. Clear () + Add ()).Дайте мне знать, если это нарушитель соглашения, есть способ обойти это, хотя это немного больше работы.

3 голосов
/ 20 июля 2011

Я наконец понял это.Использование ReactiveCommand.Create() сработало для моей ситуации.

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

  AddNewRecord.Subscribe(x => 
  {
     MyCollection.Add("foo");
  }
}
...