public MainWindowViewModel() { #region Test AddMemberName = new ReactiveProperty <string>(string.Empty); AddMemberIsLong = new ReactiveProperty <bool>(false); AddMemberIsSelected = new ReactiveProperty <bool>(false); RemoveMemberName = new ReactiveProperty <string>(string.Empty); AddMemberCommand = new AsyncReactiveCommand(); AddMemberCommand.Subscribe(_ => AddMember(AddMemberName.Value, AddMemberIsLong.Value, AddMemberIsSelected.Value)); RemoveMemberCommand = new ReactiveCommand(); RemoveMemberCommand.Subscribe(_ => RemoveMember(RemoveMemberName.Value)); ClearMemberCommand = Members.ObserveProperty(x => x.Count).Select(x => 0 < x).ToReactiveCommand(); ClearMemberCommand.Subscribe(_ => ClearMember()); #endregion PopulateMembers(); Members .ObserveElementProperty(x => x.IsLong) .Where(x => x.Value) .Subscribe(x => ShowName(x.Instance)); Members .ObserveElementObservableProperty(x => x.IsSelected) .Where(x => x.Value) .Subscribe(x => ShowName(x.Instance)); // IsAllLong: Original IsAllLong = Members .ObserveElementProperty(x => x.IsLong) .Select(_ => Members.All(x => x.IsLong)) .ToReactiveProperty(); // IsAllLong: Alternative IFilteredReadOnlyObservableCollection <MemberViewModel> membersNotLong = Members .ToFilteredReadOnlyObservableCollection(x => !x.IsLong); IsAllLong = membersNotLong .CollectionChangedAsObservable() .Select(_ => Members.Any() && (0 == membersNotLong.Count)) .ToReactiveProperty(); // IsAnySelected: Original IsAnySelected = Members .ObserveElementObservableProperty(x => x.IsSelected) .Select(_ => Members.Any(x => x.IsSelected.Value)) .ToReactiveProperty(); // IsAnySelected: Alternative 1 List <MemberViewModel> membersSelected = new List <MemberViewModel>(); IObservable <bool> elementPropertyChanged = Members .ObserveElementObservableProperty(x => x.IsSelected) .Do(x => { if (!x.Value) { membersSelected.Remove(x.Instance); } else if (!membersSelected.Contains(x.Instance)) { membersSelected.Add(x.Instance); } }) .Select(_ => 0 < membersSelected.Count); IObservable <bool> collectionChanged = Members .CollectionChangedAsObservable() .Where(x => x.Action != NotifyCollectionChangedAction.Move) .Do(x => { switch (x.Action) { case NotifyCollectionChangedAction.Add: case NotifyCollectionChangedAction.Remove: case NotifyCollectionChangedAction.Replace: if (x.OldItems != null) { foreach (var instance in x.OldItems.Cast <MemberViewModel>()) { membersSelected.Remove(instance); } } if (x.NewItems != null) { foreach (var instance in x.NewItems.Cast <MemberViewModel>()) { if (membersSelected.Contains(instance)) { continue; } if (instance.IsSelected.Value) { membersSelected.Add(instance); } } } break; case NotifyCollectionChangedAction.Reset: membersSelected.Clear(); break; } }) .Select(_ => 0 < membersSelected.Count); IsAnySelected = Observable.Merge(elementPropertyChanged, collectionChanged) .ToReactiveProperty(); // IsAnySelected: Alternative 2 IsAnySelected = Members .ObserveElementBooleanObservableProperty(x => x.IsSelected) .Select(x => 0 < x.Count) .ToReactiveProperty(); // IsAnySelected: Alternative 3 IsAnySelected = Members .ObserveElementFilteredObservableProperty(x => x.IsSelected, x => x) .Select(x => 0 < x.Count) .ToReactiveProperty(); }