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
并使用相对来源搜索具有 ListOfCategory
的 Datagrid
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
名称而不是元素绑定。
我有类
[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
并使用相对来源搜索具有 ListOfCategory
的 Datagrid
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
名称而不是元素绑定。