0

我的数据网格“dgSubsytem”列定义如下

 <my:DataGridComboBoxColumn x:Name="cmbSubSysSupplier_SRV" Header="Supplier"  Width="160"                                            
                                         ItemsSource="{Binding RelativeSource}" SelectedValueBinding="{Binding SupplierId}"   />

正如您从代码中看到的,我在网格中有一个组合框。

这个组合框的项目源是一个数据表,它在后面的代码中绑定到它。

网格的项目源也是绑定在代码后面的另一个数据表。

后面代码中combobox的绑定项源代码如下

cmbSubSysSupplier_SRV.ItemsSource = dsComboBox.Tables[3].DefaultView;
cmbSubSysSupplier_SRV.DisplayMemberPath="FullName" ;
cmbSubSysSupplier_SRV.SelectedValuePath = "SupplierId"; 

问题是组合框本身不呈现。但我可以看到 Supplier 的值呈现为 text 。问题是什么?

4

3 回答 3

0

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

ItemsSource在两个地方设置 - 在 XAML 和代码隐藏中。无论哪个第二个运行都会覆盖第一个的值,因此只会使用最后一个值集。

我怀疑你的 XAML 是最后运行的,并且RelativeSource可能不是你的属性DataContext,所以你ComboBox最终什么都没有。

要修复它,只需删除您ItemsSource在 XAML 中的绑定DataGridComboBoxColumn

<my:DataGridComboBoxColumn x:Name="cmbSubSysSupplier_SRV" 
                           Header="Supplier" Width="160"
                           SelectedValueBinding="{Binding SupplierId}"  />

此外,DefaultViewaDataTable将返回一个 type 的对象DataView,并且DataView没有称为FullNameor的属性SupplierId,因此您的SelectedValuePathandDisplayMemberPath属性将不起作用。

我建议KeyValuePair<int,string>从您的数据项中构建一个列表,并将您绑定ComboBoxColumn.ItemsSource到该列表,然后切换SelectedValuePathto"Key"DisplayMemberPathto"Value"

于 2012-10-11T14:02:04.707 回答
0

这里有2个部分:

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

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

不需要在代码中绑定。

于 2012-10-11T11:43:29.350 回答
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>
于 2012-10-11T15:09:28.500 回答