WPF MVVM中BindingExpression路径错误求助(DevExpress场景)
这种绑定路径报错真的太磨人了,尤其是之前功能好好的突然出问题,我帮你梳理几个高频排查方向,你可以逐一核对:
先确认
ListControls集合的属性定义是否合规
要确保它是public修饰的属性,且继承自ObservableCollection<T>;如果是动态赋值的情况,ViewModel必须实现INotifyPropertyChanged并触发属性变更通知,比如:private ObservableCollection<YourControlItemModel> _listControls; public ObservableCollection<YourControlItemModel> ListControls { get => _listControls; set { _listControls = value; RaisePropertyChanged(nameof(ListControls)); } }另外别忘了检查ViewModel是否正确关联到用户控件的DataContext——比如是不是用DevExpress的
ViewModelSource.Create<YourViewModel>()创建的实例,或者XAML里有没有正确设置DataContext。核对ItemTemplate内的绑定路径细节
你提供的XAML代码被截断了,重点要确认DataTemplate里TextBox绑定的属性,是否存在于ListControls集合的元素类型中?比如你的集合是ObservableCollection<FormItem>,那TextBox绑定的Text="{Binding ItemContent}"里的ItemContent必须是FormItem类的public属性,拼写、大小写都不能错。如果需要动态更新,这个属性所在的类也要实现INotifyPropertyChanged。查看Visual Studio输出窗口的错误详情
调试运行程序时,Visual Studio的「输出」窗口会打印绑定错误的完整信息,比如:BindingExpression path error: 'XXX' property not found on 'object' ''YYY' (HashCode=12345)'
这条信息会直接告诉你找不到的属性名、以及当前绑定的数据源类型,是最快定位问题的方法。排查DataContext是否被意外覆盖
ItemsControl的ItemTemplate默认会把DataContext设为集合的单个元素,但如果后来修改了布局,比如在Grid外面套了DevExpress的LayoutControl之类的控件,有没有手动设置过父控件的DataContext?如果有的话,可能会导致子控件的绑定上下文跑偏,这时可以用RelativeSource指定正确的数据源,比如:<TextBox Text="{Binding DataContext.TargetProperty, RelativeSource={RelativeSource AncestorType=ItemsControl}}"/>检查DevExpress控件的特殊绑定规则
如果是把原生TextBox换成了DevExpress的TextEdit,要注意它的绑定属性是EditValue而非Text,这是新手容易踩的坑;另外某些DevExpress控件可能有自身的MVVM绑定配置,比如是否启用了CommandBindings之类的,不过这条优先级可以靠后,毕竟你之前功能是正常的。
内容的提问来源于stack exchange,提问作者mecocopy

