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

WPF bind DataGrid column ComboBox from database table using id

我有类

[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

我在这里创建了 ObservableCollection 的产品和类别,名称为 ProductSet & ListOfCategory,级别为 Window。

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

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

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

因为您需要绑定数据上下文,所以用 Window1 设置了 elementBinding 并设置了 ItemsSource="{Binding ProductSet}"。所以这里发生的是 ProuctSet 搜索 DataContext,后者又在 Window1 Class.

中搜索

对于 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>

如果您要使用视图模型进行绑定,请提供 Class Viewmodel 名称而不是元素绑定。