在DataGridComboBoxColumn中绑定相关数据

时间:2017-07-13 04:40:57

标签: c# wpf datagrid datagridcomboboxcolumn

我有一个数据网格,可以很好地显示数据,但现在我想用它来编辑数据。如何配置DataGridComboBoxColumn以显示描述,但绑定到相关表的ID?

我的数据通过EF进入应用程序,但为了将正确过滤的数据导入DataGrid,我使用DbQuery创建List<>,然后将其设置为{{ 1}} DataGrid

ItemsSource

这样填充private void OnControlLoaded(object sender, RoutedEventArgs e) { DbQuery<Product> whiteGoodsProductQuery = this.GetWhitegoodsProductsQuery(myEntities); List<Product> lstWhiteGoodsProducts = whiteGoodsProductQuery.ToList<Product>(); dgridWhitegoodProducts.ItemsSource = lstWhiteGoodsProducts; }

DataGrid

现在,我想将制造商<DataGrid x:Name="dgridWhitegoodProducts" AutoGenerateColumns="False"> <DataGrid.Columns> <!-- Manufacturer --> <DataGridTextColumn Header="Manufacturer" Binding="{Binding Manufacturer.CompanyName}" /> <!-- Product --> <DataGridTextColumn Header="Name" Binding="{Binding ProductName }" /> <!-- Description --> <DataGridTextColumn Header="Product Description" Binding="{Binding ProductDescription }"/> <!-- Length --> <DataGridTextColumn Header="Length (mm)" Binding="{Binding Length}"/> <!-- Width --> <DataGridTextColumn Header="Width (mm)" Binding="{Binding Width}"/> <!-- Height --> <DataGridTextColumn Header="Height (mm)" Binding="{Binding Height}"/> <!-- Price --> <DataGridTextColumn Header="Price" Binding="{Binding UnitPrice}"/> </DataGrid.Columns> </DataGrid> 更改为DataGridTextColumn,以便用户可以选择其他制造商。当我设置ComboBox列时,我没有得到任何数据,所以我显然在绑定中做错了。

这是我的组合框列最初的样子:

DataGridComboBoxColumn

目前它看起来像:

<DataGridComboBoxColumn Header="Manufacturer"
    SelectedValueBinding="{Binding ManufacturerID, Mode=TwoWay}" 
    SelectedValuePath="Manufacturer.ID" 
    DisplayMemberPath="Manufacturer.CompanyName" />

ItemsSource来自代码隐藏中的静态ObservableCollection。

<DataGridComboBoxColumn Header="Manufacturer" SelectedValueBinding="{Binding 
    ManufacturerID}" SelectedValuePath="ID" DisplayMemberPath="CompanyName}" 
    ItemsSource="{Binding Source={StaticResource ManufacturerList}" />

我在SelectedValuePath,SelectedValueBinding等属性中尝试了许多[TableName。]字段的变体,但无济于事。

我接下来尝试的是在ComboBoxColumn可以绑定的代码隐藏中创建一个列表List,但是当我将List设置为ItemsSource时,我得到:public static ObservableCollection<Manufacturer> ManufacturerList = new ObservableCollection<Manufacturer>(new MyEntities().Manufacturers);

将该列表更改为ObservableCollection也不起作用,也没有将其设置为静态。

任何人都可以看到我做错了什么以及我应该从哪里走?

2 个答案:

答案 0 :(得分:1)

您只能绑定到公共属性,而ManufacturerList是一个字段。

如果您在UserControl的代码隐藏中将其定义为非静态属性:

public ObservableCollection<Manufacturer> ManufacturerList { get; } = new ObservableCollection<Manufacturer>(new MyEntities().Manufacturers);

...你可以像这样绑定它:

<DataGridComboBoxColumn Header="Manufacturer" SelectedValueBinding="{Binding ManufacturerID, Mode=TwoWay}" 
                        SelectedValuePath="ID" 
                        DisplayMemberPath="CompanyName">
    <DataGridComboBoxColumn.ElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding DataContext.ManufacturerList, RelativeSource={RelativeSource AncestorType=UserControl}}" />
        </Style>
    </DataGridComboBoxColumn.ElementStyle>
    <DataGridComboBoxColumn.EditingElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding DataContext.ManufacturerList, RelativeSource={RelativeSource AncestorType=UserControl}}" />
        </Style>
    </DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>

IDCompanyName应该是Manufacturer类的公共属性,ManufacturerIDProduct类的公共属性。

您需要在样式中设置ItemsSource属性的原因是DataGridComboBoxColumn不是可添加到元素树的可视元素,因此它没有可视祖先。

修改

  

显然,DataContext的{​​{1}}是UserControl。这是一个示例,说明在提问时始终提供reproducible sample问题的原因。

无论如何,您可以在CollectionViewSource中定义另一个CollectionViewSource,并将此来源设置为您的UserControl个对象的集合,并将列绑定为:

Manufacturer

...其中<DataGridComboBoxColumn ... ItemsSource="{Binding Source={StaticResource ManufacturerList}}" /> ManufacturerList的{​​{1}}。

答案 1 :(得分:0)

您必须定义用户控制资源,如bellow

dataLayer.push({
    'event:'addImpressions',
    'ecommerce' : {
        'impressions' : batch 1
     }
});
dataLayer.push({
    'event:'addImpressions',
    'ecommerce' : {
        'impressions' : batch 2
     }
});
  1. 将数据网格组合列绑定如下

    DataGridComboBoxColumn标题=&#34;用户类型&#34; ItemsSource =&#34; {Binding Source = {StaticResource UserTypeList}}

  2. DomainType将是视图模型属性。

    DomainUserTypes = new ObservableCollection();

  3. 只需使用数据和测试填充View模型属性,它就可以工作。