我有一个数据网格,可以很好地显示数据,但现在我想用它来编辑数据。如何配置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也不起作用,也没有将其设置为静态。
任何人都可以看到我做错了什么以及我应该从哪里走?
答案 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>
ID
和CompanyName
应该是Manufacturer
类的公共属性,ManufacturerID
是Product
类的公共属性。
您需要在样式中设置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
}
});
将数据网格组合列绑定如下
DataGridComboBoxColumn标题=&#34;用户类型&#34; ItemsSource =&#34; {Binding Source = {StaticResource UserTypeList}}
DomainType将是视图模型属性。
DomainUserTypes = new ObservableCollection();
只需使用数据和测试填充View模型属性,它就可以工作。