ReactiveUI - 将ReactiveList <object>绑定到ObservableCollection

时间:2015-07-06 15:52:23

标签: c# wpf binding reactiveui

我在使用ReactiveUI将我的ViewModel上的ReactiveList<object>绑定到WPF视图中控件的SelectedItems属性(ObservableCollection<object>)时遇到问题。我试过了:

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

但是我收到了错误:

  

ReactiveUI.dll中出现“System.ArgumentException”类型的异常,但未在用户代码中处理

     

附加信息:无法在ReactiveUI.ReactiveList [System.Object]和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);

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

  

ReactiveUI.dll中出现“System.ArgumentException”类型的异常,但未在用户代码中处理

     

其他信息:无法将System.Collections.Generic.IEnumerable [System.Object]转换为ReactiveUI.ReactiveList [System.Object]。要解决此问题,请注册IBindingTypeConverter

我做错了什么?任何建议都感激不尽!

2 个答案:

答案 0 :(得分:0)

很抱歉答案非常晚,但使用ReactiveUI可以做的就是这样。为您的平台添加reactiveui-events- package,然后在视图代码中添加以下内容:

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>());
                    }
                }));
        });

通过这种方式,您将获得一个可以改变用户交互的被动列表,您可以对视图模型中的这些更改做出反应。

答案 1 :(得分:0)

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

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

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

相关问题