예제 #1
0
        public TodoAppContext()
        {
            this.doneItems = this.AllItems
                             .ToFilteredReadOnlyObservableCollection(x => x.Done);

            this.todoItems = this.AllItems
                             .ToFilteredReadOnlyObservableCollection(x => !x.Done);

            this.AllItems
            .ObserveElementProperty(x => x.Done, isPushCurrentValueAtFirst: false)
            .Subscribe(async _ => await this.SaveAsync());
        }
예제 #2
0
        public TodoAppContext()
        {
            this.doneItems = this.AllItems
                .ToFilteredReadOnlyObservableCollection(x => x.Done);

            this.todoItems = this.AllItems
                .ToFilteredReadOnlyObservableCollection(x => !x.Done);

            this.AllItems
                .ObserveElementProperty(x => x.Done, isPushCurrentValueAtFirst: false)
                .Subscribe(async _ => await this.SaveAsync());
        }
예제 #3
0
        public MainPageViewModel()
        {
            var source = new ObservableCollection<Item>();
            this.Items = source.ToFilteredReadOnlyObservableCollection(_ => true);

            var timer = new DispatcherTimer();
            timer.Tick += (_, __) =>
            {
                source.Add(new Item { Value = "item" + source.Count });
            };
            timer.Interval = TimeSpan.FromSeconds(1);
            timer.Start();
        }
        public CollectionsViewModel()
        {
            AddToReactiveCollectionCommand = new ReactiveCommand()
                                             .AddTo(Disposables);
            ReactiveCollection = AddToReactiveCollectionCommand
                                 .Select(_ => Guid.NewGuid())
                                 .ToReactiveCollection()
                                 .AddTo(Disposables);
            ClearReactiveCollectionCommand = new ReactiveCommand()
                                             .AddTo(Disposables);
            ClearReactiveCollectionCommand.ObserveOn(TaskPoolScheduler.Default)
            .Subscribe(_ =>
            {
                ReactiveCollection.ClearOnScheduler();
            });

            GuidViewModels = _model.Guids
                             .ToReadOnlyReactiveCollection(x => new GuidViewModel(x))
                             .AddTo(Disposables);
            AddGuidToModelCommand = new ReactiveCommand()
                                    .AddTo(Disposables);
            AddGuidToModelCommand.ObserveOn(TaskPoolScheduler.Default)
            .Subscribe(_ => _model.Guids.Add(Guid.NewGuid()))
            .AddTo(Disposables);
            ClearModelGuidsCommand = new ReactiveCommand()
                                     .AddTo(Disposables);
            ClearModelGuidsCommand.ObserveOn(TaskPoolScheduler.Default)
            .Subscribe(_ => _model.Guids.Clear())
            .AddTo(Disposables);

            FilterSourceItems = new ObservableCollection <FilterSourceItem>();
            FilteredItems     = FilterSourceItems
                                .ToFilteredReadOnlyObservableCollection(x => x.Count >= 7)
                                .AddTo(Disposables);
            AddToFilterSourceItemsCommand = new ReactiveCommand()
                                            .WithSubscribe(() => FilterSourceItems.Add(new FilterSourceItem()))
                                            .AddTo(Disposables);
            ClearFromFilterSourceItemsCommand = FilterSourceItems.ObserveProperty(x => x.Count)
                                                .Select(x => x != 0)
                                                .ToReactiveCommand()
                                                .WithSubscribe(() =>
            {
                foreach (var d in FilterSourceItems)
                {
                    d.Dispose();
                }

                FilterSourceItems.Clear();
            })
                                                .AddTo(Disposables);
        }
예제 #5
0
        public IFilteredReadOnlyObservableCollection1ViewModel()
        {
            AddCommand   = new ReactiveCommand().AddTo(CompositeDisposable);
            ClearCommand = new ReactiveCommand().AddTo(CompositeDisposable);

            SourceValues = AddCommand
                           .Select(_ => new ValueHolder(SourceValues.Count))
                           .ToReadOnlyReactiveCollection(onReset: ClearCommand.ToUnit())
                           .AddTo(CompositeDisposable);

            FilteredValues = SourceValues
                             .ToFilteredReadOnlyObservableCollection(x => (x.Value % 3) == 0)
                             .AddTo(CompositeDisposable);
        }
예제 #6
0
        public MainPageViewModel()
        {
            var source = new ObservableCollection <Item>();

            this.Items = source.ToFilteredReadOnlyObservableCollection(_ => true);

            var timer = new DispatcherTimer();

            timer.Tick += (_, __) =>
            {
                source.Add(new Item {
                    Value = "item" + source.Count
                });
            };
            timer.Interval = TimeSpan.FromSeconds(1);
            timer.Start();
        }
        public MainWindowViewModel()
        {
            // IFilteredReadOnlyObservableCollectionを使うためにTypeをReactivePropertySlimで包んでいる。
            // 選んだ理由はINotifyPropertyChangedを実装しているからで、それ以上の意味はない。
            var rc = new ReactiveCollection <ReactivePropertySlim <Type> >();

            rc.AddRangeOnScheduler(XamlCreator.GetControlList().Select(x => new ReactivePropertySlim <Type>(x)));

            bool FilterFunc(ReactivePropertySlim <Type> x)
            {
                return(string.IsNullOrWhiteSpace(this.SearchWord.Value) || x.Value.ToString().IndexOf(this.SearchWord.Value, StringComparison.OrdinalIgnoreCase) >= 0);
            }

            this.Controls = rc.ToFilteredReadOnlyObservableCollection(FilterFunc);
            this.SearchWord.Subscribe(_ => {
                this.Controls.Refresh(FilterFunc);
            });
            this.Xaml = this.SelectedControl.Select(x => XamlCreator.Create(x?.Value)).ToReadOnlyReactivePropertySlim();
        }
예제 #8
0
        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();
        }
예제 #9
0
 /// <summary>
 /// Observe collection element's PropertyChanged event.
 /// </summary>
 /// <typeparam name="TElement">Type of Element</typeparam>
 /// <param name="source">source collection</param>
 /// <returns>PropertyChanged event stream.</returns>
 public static IObservable <SenderEventArgsPair <TElement, PropertyChangedEventArgs> > ObserveElementPropertyChanged <TElement>(this IFilteredReadOnlyObservableCollection <TElement> source)
     where TElement : class, INotifyPropertyChanged =>
 CollectionUtilities.ObserveElementPropertyChanged <IFilteredReadOnlyObservableCollection <TElement>, TElement>(source);
예제 #10
0
 /// <summary>
 /// Observe collection element's IObservable sequence.
 /// </summary>
 /// <typeparam name="TElement">Collection element type</typeparam>
 /// <typeparam name="TProperty">Type of observable property element</typeparam>
 /// <param name="source">Source collection</param>
 /// <param name="propertySelector">IObservable selection expression</param>
 /// <returns>IObservable sequence sequence</returns>
 public static IObservable <PropertyPack <TElement, TProperty> > ObserveElementObservableProperty <TElement, TProperty>(this IFilteredReadOnlyObservableCollection <TElement> source, Expression <Func <TElement, IObservable <TProperty> > > propertySelector)
     where TElement : class, INotifyPropertyChanged =>
 CollectionUtilities.ObserveElementObservableProperty(source, propertySelector);
예제 #11
0
 /// <summary>
 /// Observe collection element's property.
 /// </summary>
 /// <typeparam name="TElement">Type of element</typeparam>
 /// <typeparam name="TProperty">Type of property</typeparam>
 /// <param name="source">Data source</param>
 /// <param name="propertySelector">Property selection expression</param>
 /// <param name="isPushCurrentValueAtFirst">Push current value on first subscribe</param>
 /// <returns>Property sequence</returns>
 public static IObservable <PropertyPack <TElement, TProperty> > ObserveElementProperty <TElement, TProperty>(this IFilteredReadOnlyObservableCollection <TElement> source, Expression <Func <TElement, TProperty> > propertySelector, bool isPushCurrentValueAtFirst = true)
     where TElement : class, INotifyPropertyChanged =>
 CollectionUtilities.ObserveElementProperty(source, propertySelector, isPushCurrentValueAtFirst);