DataGridComboBoxColumn绑定失效:是否仅支持静态资源?
DataGridComboBoxColumn绑定ObservableCollection失效的原因及解决方法
问题核心
你遇到的第三种场景失效,不是DataGridComboBoxColumn仅支持静态资源绑定,而是它的绑定上下文和DataGridTemplateColumn中的ComboBox完全不同:
- DataGrid的列对象(如DataGridComboBoxColumn)不属于可视化树,它们的默认DataContext是DataGrid的整体DataContext,而非每行数据的DataContext。
- 你写
ItemsSource="{Binding CategoryList}"时,它会去DataGrid的全局DataContext里找这个集合,而不是每行数据对象中的CategoryList,自然绑定失败。 - 而DataGridTemplateColumn里的ComboBox属于可视化树,继承自单元格的DataContext(即当前行的数据对象),所以能正确找到行内的CategoryList。
解决方案
根据你的场景(CategoryList是每行数据对象的属性),可以通过相对源绑定指定正确的上下文:
<DataGridComboBoxColumn Header="Category" SelectedItemBinding="{Binding Category, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding DataContext.CategoryList, RelativeSource={RelativeSource AncestorType=DataGridRow}}" IsReadOnly="False"/>
如果CategoryList是ViewModel级别的全局集合(所有行共享),则绑定到DataGrid的DataContext:
<DataGridComboBoxColumn Header="Category" SelectedItemBinding="{Binding Category, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding DataContext.CategoryList, RelativeSource={RelativeSource AncestorType=DataGrid}}" IsReadOnly="False"/>
补充说明
静态资源能生效,是因为静态资源是全局可访问的,和绑定上下文无关,所以无论列的DataContext是什么,都能找到对应的资源。
内容的提问来源于stack exchange,提问作者Pavel
相关产品推荐
相关产品推荐

