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做的事情是这样的。为你的平台添加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);
请注意,SelectedCountries
是IEnumerable
,因为当它更新时触发其他事件。