我刚刚开始使用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/