Хобрук: Ваш путь к мастерству в программировании

ReactiveUI — привязка объекта ReactiveList к ObservableCollection

У меня возникла проблема с использованием ReactiveUI для привязки ReactiveList<object> в моей ViewModel к свойству SelectedItems (ObservableCollection<object>) элемента управления в моем представлении WPF. Я попытался:

this.Bind(ViewModel, vm => vm.SelectedItems, x => x.CBSelect.SelectedItems);

но я получаю сообщение об ошибке:

Исключение типа «System.ArgumentException» возникло в ReactiveUI.dll, но не было обработано в пользовательском коде.

Дополнительная информация: невозможно двустороннее преобразование между ReactiveUI.ReactiveList[System.Object] и System.Collections.ObjectModel.ObservableCollection[System.Object]. Чтобы это исправить, зарегистрируйте IBindingTypeConverter

Я видел, что Пол Беттс рекомендовал другой подход в другом посте, используя:

 this.WhenAnyValue(x => x.countries.SelectedItems)
    .Select(list => list.Cast<Country>())
    .BindTo(this, x => x.ViewModel.SelectedCountries);

Я пробовал это, но я получаю ошибку, аналогичную первой:

Исключение типа «System.ArgumentException» возникло в ReactiveUI.dll, но не было обработано в пользовательском коде.

Дополнительная информация: невозможно преобразовать System.Collections.Generic.IEnumerable[System.Object] в ReactiveUI.ReactiveList[System.Object]. Чтобы это исправить, зарегистрируйте IBindingTypeConverter

Что я делаю не так? Любые предложения с благодарностью принимаются!

06.07.2015

  • Я думаю, что ваша проблема на самом деле не связана с ReactiveUI - у вас будет эта проблема с любой инфраструктурой или без нее. SelectedItems свойства обычно доступны только для чтения, поэтому к ним нельзя привязаться. Обычное решение состоит в том, чтобы создать прикрепленное свойство или поведение, которое синхронизируется между ними (прослушивание изменений в каждом и вставка/удаление в другом). 06.07.2015
  • Вы правы в том, что SelectedItems доступен только для чтения. Меня отвлекло сообщение об ошибке. Я реализую что-то, чтобы синхронизировать их, как вы предлагаете. Спасибо! 08.07.2015
  • Если вы хотите сэкономить время, погуглите — я уверен, что многие другие реализовали это! 08.07.2015

Ответы:


1

Извините за очень поздний ответ, но то, что вы могли бы сделать с помощью ReactiveUI, выглядит примерно так. Добавьте пакет reactiveui-events- для своей платформы, а затем в просмотрите код, добавьте это:

this.WhenActivated(d => {
            d(this.countries.Events()
                .SelectionChanged
                .Subscribe(ea => {
                    using (ViewModel.SelectedCountries.SuppressChangeNotifications())
                    {
                        ViewModel.SelectedCountries.RemoveAll(ea.RemovedItems.Cast<Country>());
                        ViewModel.SelectedCountries.AddRange(ea.AddedItems.Cast<Country>());
                    }
                }));
        });

Таким образом, вы получите реактивный список, который будет меняться при взаимодействии с пользователем, и вы сможете реагировать на эти изменения в модели представления.

10.02.2018

2

Можно привязать SelectedItems непосредственно к свойству и избежать работы с аргументами события SelectionChanged.

this.DataGrid1.Events().SelectionChanged
    .Select(x => this.DataGrid1.SelectedItems.Cast<CountryModel>())
    .BindTo(this, x => x.ViewModel.SelectedCountries);

Обратите внимание, что SelectedCountries — это IEnumerable, так как при его обновлении запускаются другие события.

01.06.2018
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..