我的数据网格“dgSubsytem”列定义如下
<my:DataGridComboBoxColumn x:Name="cmbSubSysSupplier_SRV" Header="Supplier" Width="160"
ItemsSource="{Binding RelativeSource}" SelectedValueBinding="{Binding SupplierId}" />
从代码中可以看出我在网格中有一个组合框。
此组合框的项目源是一个数据表,它在后面的代码中绑定到它。
网格的项目源也是后面代码中绑定的另一个数据表。
后面代码中组合框的绑定项源代码如下
cmbSubSysSupplier_SRV.ItemsSource = dsComboBox.Tables[3].DefaultView;
cmbSubSysSupplier_SRV.DisplayMemberPath="FullName" ;
cmbSubSysSupplier_SRV.SelectedValuePath = "SupplierId";
问题是组合框本身无法渲染。但我可以看到供应商的价值呈现为文本。问题是什么?
答案 0 :(得分:0)
这里有两部分:
要在ComboBox中填充的值列表:ItemsSource,应使用StaticResource进行绑定,并从ViewModel公开List<X>
个字段。
实际值(此处为X)应使用绑定到数据项绑定到SelectedItemBinding。
在所需的代码中没有绑定。
答案 1 :(得分:0)
你的代码隐藏的东西在什么时候运行?
您在两个位置设置ItemsSource
- 在XAML和Code-Behind中。无论哪一个运行第二个将覆盖第一个的值,因此将只使用最后一个值集。
我怀疑你的XAML最后一次运行,而RelativeSource
可能不是DataContext
上的属性,所以你的ComboBox
最终会被绑定到任何东西。
要解决此问题,只需删除ItemsSource
DataGridComboBoxColumn
绑定即可
<my:DataGridComboBoxColumn x:Name="cmbSubSysSupplier_SRV"
Header="Supplier" Width="160"
SelectedValueBinding="{Binding SupplierId}" />
此外,DefaultView
的{{1}}将返回DataTable
类型的对象,DataView
没有名为DataView
或{{{{}}的属性1}},因此您的FullName
和SupplierId
属性将无效。
我建议您在数据项中列出SelectedValuePath
,然后将DisplayMemberPath
绑定到该列表,然后将KeyValuePair<int,string>
切换为ComboBoxColumn.ItemsSource
SelectedValuePath
至"Key"
答案 2 :(得分:0)
我个人与DataGridComboBoxColumn打了很长时间,我认为方法是使用DataGridTemplateColumn
。
这是一个例子:
看起来很多代码但很有意义。 将集合作为资源:
<Grid.Resources>
<CollectionViewSource x:Key="StructuresCollection" Source="{Binding StructuresList, Mode=OneTime}"/>
</Grid.Resources>
<DataGridTemplateColumn Header="Structure" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Structures.Name}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate >
<DataTemplate>
<ComboBox x:Name="CStructures" SelectedItem="{Binding Structures}" DisplayMemberPath="Name" SelectedValue="{Binding IDStructure, UpdateSourceTrigger=PropertyChanged}" SelectedValuePath="{Binding IDStructure}" ItemsSource="{Binding Source={StaticResource StructuresCollection}}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>