Rx отлично подходит для коллекций. Сейчас я не могу представить себе работу с языком, который не имеет LINQ-подобной функциональности.
В последнее время стало так же для Rx, в основном из-за библиотеки, которая использует Rx для LINQ: DynamicData
ReadOnlyObservableCollection<TradeProxy> list;
var myTradeCache = new SourceCache<Trade, long>(trade => trade.Id);
var myOperation = myTradeCache.Connect()
.Filter(trade=>trade.Status == TradeStatus.Live)
.Transform(trade => new TradeProxy(trade))
.Sort(SortExpressionComparer<TradeProxy>.Descending(t => t.Timestamp))
.ObserveOnDispatcher()
.Bind(out list)
.DisposeMany()
.Subscribe()
По сути, вы можете создавать LINQ-подобные запросы, которые динамически обновляются после любого изменения - нового элемента в исходном списке (достаточно DTO!), Некоторого изменения свойства, сигнала из другого места (передаваемого как наблюдаемый) и т. Д.
Вы хотите отобразить количество объектов с флагом? Один лайнер.
Вы хотите легко отображать динамические группы, основанные на свойствах, выбранных пользователем? Один лайнер.
Вы хотите сделать пейджинг? 3 строки: P
Кроме того, существует инфраструктура MVVM под названием ReactiveUI - она предоставляет вам ReactiveCommand и еще несколько хитростей.
Среди них - связывающая среда с преобразователями на основе лямбд, способность реагировать в представлении на что-то очень специфическое, что произошло в вашей виртуальной машине, управление активацией моделей представления (например, начальное выполнение команды, но не в конструкторе).
Вы хотите, чтобы кнопка входа в систему была включена только в том случае, если имя пользователя и пароль не пусты?
Login = ReactiveCommand.CreateFromTask(async () => { /* your async implementation, it can return a value! */},
this.WhenAnyValue(x => x.Username, x => x.Password, (user, psw) => !string.IsNullOrEmpty(user) && !string.IsNullOrEmpty(psw)); // define when the command can execute by providing IObservable<bool>
Login.Where(x => x == true) // only successful logins, ==true for clarity
.InvokeCommand(DisplayMainScreen); // or something
В поле зрения вы можете сделать:
Login.Where(x => !x).Subscribe(_ =>{ // if login failed, set focus on password and select all text so user can just retype the password
PasswordBox.SelectAllText(); // can't remember exact methods, but you get the idea
PasswordBox.SetFocus();
});
Для вас становится вполне естественным создавать такие функции, как «Когда что-то, сделайте это»