Combobox无法在wpf datagrid中渲染

时间:2012-10-11 11:30:56

标签: c# wpf datagrid combobox

我的数据网格“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"; 

问题是组合框本身无法渲染。但我可以看到供应商的价值呈现为文本。问题是什么?

3 个答案:

答案 0 :(得分:0)

这里有两部分:

要在ComboBox中填充的值列表:ItemsSource,应使用StaticResource进行绑定,并从ViewModel公开List<X>个字段。

实际值(此处为X)应使用绑定到数据项绑定到SelectedItemBinding。

在所需的代码中没有绑定。

答案 1 :(得分:0)

你的代码隐藏的东西在什么时候运行?

您在两个位置设置ItemsSource - 在XAML和Code-Behind中。无论哪一个运行第二个将覆盖第一个的值,因此将只使用最后一个值集。

我怀疑你的XAML最后一次运行,而RelativeSource可能不是DataContext上的属性,所以你的ComboBox最终会被绑定到任何东西。

要解决此问题,只需删除ItemsSource

的XAML中的DataGridComboBoxColumn绑定即可
<my:DataGridComboBoxColumn x:Name="cmbSubSysSupplier_SRV" 
                           Header="Supplier" Width="160"
                           SelectedValueBinding="{Binding SupplierId}"  />

此外,DefaultView的{​​{1}}将返回DataTable类型的对象,DataView没有名为DataView或{{{{}}的属性1}},因此您的FullNameSupplierId属性将无效。

我建议您在数据项中列出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>