我在使用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
我做错了什么?任何建议都感激不尽!
答案 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);
请注意,SelectedCountries
是IEnumerable
,因为更新时会触发其他事件。