WPF中能否用ObjectDataProvider填充DataGrid?绑定异常求助
问题排查与修复方案
嘿,我一眼就看到问题出在哪了——你的DataGrid本身的数据源绑定其实是没问题的,坑在DataGridTemplateColumn里的TextBox绑定逻辑上!
先理清楚:你的ListBox能正常工作,是因为它直接绑定到了ViewModel的TestList集合,数据上下文和绑定路径都对。但DataGrid里的TextBox绑定写偏了:
<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}, Path=Name, Mode=OneWay}" IsReadOnly="True" />
这段代码是在找DataGrid控件的Name属性,但你根本没给DataGrid设置Name,所以显示空值;更重要的是,这完全不是你要的——你应该绑定到TestList里每一行对应的实体对象的属性,而不是控件本身的属性啊!
怎么改?
假设你的TestList里的每个数据项(比如叫TestItem类)有一个用来显示编辑器信息的属性,比如EditorName,那你只需要把TextBox的绑定改成:
<TextBox Text="{Binding EditorName, Mode=OneWay}" IsReadOnly="True" />
这样,每一行的TextBox就会自动取当前行数据项的EditorName值来显示了。
另外,再给你几个额外的检查点,以防万一:
- 确认
TestList是ObservableCollection<T>类型,而不是普通的List<T>——只有可观察集合才能在数据变化时自动通知UI更新; - 检查ViewModel的构造函数里有没有初始化
TestList并填充数据; - 如果你的数据项属性需要动态更新,记得让
TestItem类实现INotifyPropertyChanged接口。
要是还是有问题,你也可以把DataGrid的ItemsSource改成和ListBox完全一样的写法,先排除DataContext的影响:
<DataGrid ItemsSource="{Binding Source={StaticResource vmObjDataProv}, Path=TestList}" ...>
这样调整后,你的DataGrid应该就能正常显示数据啦!
内容的提问来源于stack exchange,提问作者Remco
相关产品推荐
相关产品推荐

