WPF+ReactiveUI项目ListBox.ItemsSource绑定ReadOnlyObservableCollection失效求解
问题根源
你代码中OneWayBind绑定的ViewModel属性选择器表达式写法错误:
在绑定声明中第二个参数的lambda表达式内,你直接访问了视图类的ViewModel属性,而非lambda的输入参数vm。ReactiveUI需要解析完整的成员访问表达式链来监听属性变更,直接写ViewModel.Recordings会被识别为常量表达式,不满足绑定解析要求,因此抛出你遇到的NotSupportedException异常。
解决方案
直接修正绑定表达式即可:
this.WhenActivated(d => { // 将 vm => ViewModel.Recordings 改为使用lambda参数vm访问属性 this.OneWayBind(ViewModel, vm => vm.Recordings, view => view.RecordingsListBox.ItemsSource).DisposeWith(d); });
可选优化项
- 建议给DynamicData的订阅添加异常处理,避免后台数据更新时抛出未处理异常:
recordindsService.RecordingsList.Connect() .Transform(rec => new RecordingViewModel(rec as IRecordingModel)) .Bind(out _recordings) .Subscribe(ex => { // 这里处理数据变更异常 }); - 不建议在视图构造函数中直接通过
Locator获取ViewModel赋值,推荐通过依赖注入的方式将ViewModel传入视图,避免视图和服务定位器耦合。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

