我刚刚开始使用ReactiveUI。我有以下课程:

public class MainViewModel : ReactiveObject, IRoutableViewModel
{
   private string shareText;

   public ReactiveCollection<SharingAccountViewModel> SelectedAccounts { get; private set; }

   public string ShareText
   {
      get { return shareText; }
      set
      {
          this.RaiseAndSetIfChanged(ref shareText, value);
      }
   }

   public IReactiveCommand ShareCommand { get; private set; }
}


我想做的是在满足以下条件时允许命令执行:


ShareText属性不为null或为空
SelectedAccounts集合包含至少一个值


我尝试了以下操作,但由于无法启用连接到命令的按钮,因此无法使用:

ShareCommand = new ReactiveCommand(this.WhenAny(viewModel => viewModel.ShareText,
  viewModel => viewModel.SelectedAccounts,
  (x, y) => !String.IsNullOrEmpty(x.Value) && y.Value.Count > 0));


但是,如果我只是检查ShareText属性,它就可以正常工作:

  ShareCommand = new ReactiveCommand(this.WhenAny(viewModel => viewModel.ShareText,
            (x) => !String.IsNullOrEmpty(x.Value)));


我查看了问题ReactiveUI: Using CanExecute with a ReactiveCommand的答案

基于此,我尝试了以下操作:

var accountsSelected = SelectedAccounts.CollectionCountChanged.Select(count => count > 0);
ShareCommand = new ReactiveCommand(accountsSelected);


这适用于我的执行标准的第二部分,因为一旦将项目添加到集合中或从集合中删除项目,连接到命令的按钮就会被正确启用或禁用。

我的问题是,现在如何将其与检查ShareText属性不为null或为空相结合?

我不能再使用this.WhenAny(..)方法,因为accountsSelected变量不是属性。

谢谢

最佳答案

IObservable一起使用WhenAny有点棘手。这是我的处理方式:

var canShare = Observable.CombineLatest(
    this.WhenAnyObservable(x => x.SelectedAccounts.CollectionCountChanged),
    this.WhenAny(x => x.ShareText, x => x.Value),
    (count, text) => count > 0 && !String.IsNullOrWhitespace(text));


WhenAnyObservable在这里的优点是,如果您决定重新分配SelectedAccounts(即SelectedAccounts = new ReactiveCollection(...);),则上面的语句仍然有效,而上面的语句仍在侦听旧的集合。

关于c# - 具有用于CanExecute的组合条件的ReactiveCommand,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15474043/

10-11 00:59