WPF 使用 id 从数据库表中绑定 DataGrid 列 ComboBox

Posted

技术标签:

【中文标题】WPF 使用 id 从数据库表中绑定 DataGrid 列 ComboBox【英文标题】:WPF bind DataGrid column ComboBox from database table using id 【发布时间】:2019-04-15 17:36:37 【问题描述】:

我有课

[Table(Name = "Categories")]
class Category

    [Column(Name = "CategoryID", IsPrimaryKey = true, IsDbGenerated = true)]
    private int CategoryID  get; set; 
    [Column(Name = "Name")]
    public string Name  get; set; 


[Table(Name = "Products")]
class Product

    [Column(Name = "ProductID", IsPrimaryKey = true, IsDbGenerated = true)]
    public int ProductID  get; set; 
    [Column(Name = "CategoryID")]
    public int CategoryID  get; set; 
    [Column(Name = "Name")]
    public string Name  get; set; 
    [Column(Name = "Price")]
    public double Price  get; set; 

我需要使用 Products 中的 CategoryID 将 DataGrid 列创建为 ComboBox,并将所有类别从 Categories 中的 ComboBox 中进行编辑,我如何使用 DataContext 来制作它

【问题讨论】:

【参考方案1】:

在这里,我在窗口级别创建了名称为 ProductSetListOfCategory 的产品和类别的 ObservableCollection

public ObservableCollection<Category> ListOfCategory  get; set; 
public ObservableCollection<Product> ProductSet   get; set; 

我在窗口后面的代码中创建了ObservableCollection,您可以在视图模型中创建它,这是更好的方法。

我已将窗口命名为“Window1”x:Name="Window1"

由于您需要绑定数据上下文,所以将elementBinding 与Window1 一起设置,并设置ItemsSource="Binding ProductSet"。所以这里发生的是ProuctSet 被搜索DataContext,然后在Window1 类中搜索。

对于DataGridComboBoxColumn,使用样式设置ItemsSource,并使用相对源搜索具有ListOfCategoryDatagrid DataContext

<DataGrid AutoGenerateColumns="False" x:Name="DataGrid1"
    HorizontalAlignment="Left" Height="135" Margin="21,288,0,0"
    VerticalAlignment="Top" Width="729"
    DataContext="Binding ElementName=Window1"
    ItemsSource="Binding ProductSet" >
    <DataGrid.Columns>
        <DataGridTextColumn Header="ProductID" Width="175"
            Binding="Binding ProductID"/>
        <DataGridComboBoxColumn Header="Category"
            DisplayMemberPath="Name" SelectedValuePath="CategoryID"
            SelectedItemBinding="Binding ListOfCategory">
            <DataGridComboBoxColumn.ElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource"
                    Value="Binding Path=DataContext.ListOfCategory,
                    RelativeSource=RelativeSource FindAncestor,
                    AncestorType=x:Type DataGrid"/>
                </Style>
            </DataGridComboBoxColumn.ElementStyle>
            <DataGridComboBoxColumn.EditingElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="Binding
                    Path=DataContext.ListOfCategory,RelativeSource=
                    RelativeSource FindAncestor,
                    AncestorType=x:Type DataGrid"/>
                </Style>
            </DataGridComboBoxColumn.EditingElementStyle>
        </DataGridComboBoxColumn>
        <DataGridTextColumn Header="Name" Width="175" Binding="Binding Name"/>
        <DataGridTextColumn Header="Price " Width="175"
            Binding="Binding Price "/>
    </DataGrid.Columns>
</DataGrid>

如果您要使用 View 模型进行绑定,则提供 Viewmodel 的类名称而不是元素绑定。

【讨论】:

以上是关于WPF 使用 id 从数据库表中绑定 DataGrid 列 ComboBox的主要内容,如果未能解决你的问题,请参考以下文章

在WPF中的Combobox中绑定

WPF 绑定

WPF入门教程系列二十一——DataGrid示例

C# WPF ComboBox - 排除绑定数据的最后一行(或空格)(从 Microsoft Access 绑定)

使用文本框的值绑定Datagrid

将内部datagrid数据与外部datagrid wpf绑定