ReactiveUI - Binding ReactiveList<object> to Observabl

本文关键字:object to Observabl gt lt Binding ReactiveList ReactiveUI | 更新日期: 2023-09-27 18:01:25

我使用ReactiveUI将我的ViewModel上的ReactiveList<object>绑定到我的WPF视图中控件的SelectedItems属性(ObservableCollection<object>)。我试着:

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

但是我得到错误:

类型为'System '的异常。在ReactiveUI.dll中发生了ArgumentException,但没有在用户代码中处理

附加信息:不能在ReactiveUI.ReactiveList[System. net]之间进行双向转换。System.Collections.ObjectModel.ObservableCollection[System.Object]。要解决这个问题,注册一个IBindingTypeConverter

我看到Paul Betts在另一篇文章中推荐了一种不同的方法:

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

我尝试了这个,但我得到了一个类似的错误,第一个:

类型为'System '的异常。在ReactiveUI.dll中发生了ArgumentException,但没有在用户代码中处理

附加信息:Can't convert System. collections . generic . ienumerable [System. collections . generic . ienumerable]到ReactiveUI.ReactiveList[System.Object]。要解决这个问题,注册一个IBindingTypeConverter

我做错了什么?任何建议,感谢收到!

ReactiveUI - Binding ReactiveList<object> to Observabl

很抱歉这么晚才回答,但你可以使用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>());
                    }
                }));
        });

这样,你将得到一个响应列表,它将在用户交互时发生变化,你可以在视图模型中对这些变化做出反应。

可以将SelectedItems直接绑定到属性,避免处理SelectionChanged事件参数

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

请注意,SelectedCountriesIEnumerable,因为当它更新时触发其他事件。