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 コレクションには少なくとも 1 つの値が含まれています
次のことを試しましたが、コマンドに接続されているボタンが有効にならないため、機能しません。
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);
アイテムがコレクションに追加またはコレクションから削除されるとすぐに、コマンドに接続されているボタンが正しく有効または無効になるため、これは実行基準の 2 番目の部分で機能します。
私の質問は、ShareText プロパティが null または空でないことを確認することとどのように組み合わせることができるかということです。
accountsSelected 変数はプロパティではないため、 this.WhenAny(..) メソッドはもう使用できません。
ありがとう