我有一个datagrid,其中是价格列表行表的数据,我使用实体框架6.数据网格包括产品名称(文本框),价格(文本框)和更改价格(DataGridComboBoxColumn)。
价格不是一种货币,它可以只是1,2,3或A,B,C或其他东西。有不同的价格类别,它是价格选择表的父级。这两个价格选择的例子可能是"数字"和#34;信件"作为价格类别。这是将每个实体相关的价格选择变为每一行的组合框的主要问题。
我现在可以将价格选择表的每个名称都添加到组合框中,与下面的代码没有任何价格类别的关系,所以现在我得到1,2,3,A,B和C.我应该得到1,2,3或A,B和C,取决于产品价格类别。 我应该如何获取Pricerows.Products.PriceCategory.PriceChoices的产品相关数据到数据网格的每一行中的组合框?
这是我所做的一幅画。 Combobox应仅显示Numbers或Letters价格类别,但现在它显示所有价格类别。新价格应作为价格更新,并显示在数据网格的价格列中。
C#:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var pricerows = context.Pricelistrows.ToList();
DataContext = this;
pricerowsViewSource.Source = pricerows;
}
XAML:
<DataGrid x:Name="pricerowsDataGrid" AutoGenerateColumns="False" Grid.ColumnSpan="4" Grid.Column="1" EnableRowVirtualization="True" ItemsSource="{Binding Source={StaticResource pricerowsViewSource}}" RowDetailsVisibilityMode="VisibleWhenSelected" Grid.RowSpan="2">
<DataGrid.Columns>
<DataGridTextColumn x:Name="productNameColumn" Binding="{Binding Name}" Header="Product name" Width="auto" IsReadOnly="True"/>
<DataGridComboBoxColumn x:Name="cbPrice" Header="Price" ItemsSource="{Binding Products.Pricecategories.Pricechoices.Name" SelectedValuePath="Name" DisplayMemberPath="Name"/>
</DataGrid.Columns>
</DataGrid>
表格:
价目表行
价目表
价格类别
价格选择
产品
答案 0 :(得分:0)
如果需要,我将从部分答案开始并更新。
所以我对你的要求的理解如下:
Product
Product
都有PriceCategory
PriceCategory
都有一个有效PriceChoice
Product
都有一个当前选定的PriceChoice
选项,需要属于正确的PriceCategory
数据库设计中的执行点4.超出了这个问题的范围,所以我将专注于让用户只在UI中选择有效值,但允许在数据库级别选择任何价格。
这将是要创建的数据库的EF模型(非真实代码)
Product
- Id
- Name
- PriceCategoryId (fk PriceCategory)
- PriceChoiceId (optional fk PriceChoice)
- [Navigation property] PriceCategory
- [Navigation property] PriceChoice
PriceChoice
- Id
- Name
- PriceCategoryId (fk PriceCategory)
- [Navigation property] PriceCategory
PriceCategory
- Id
- Name
- [Navigation property] ICollection<PriceChoice> PriceChoices
- [Navigation property] ICollection<Product> Products
无论Price list row
和Price list
是什么,根据上面列出的要求,它们与数据库模型无关。
因此,当处理单个product
时,要完成的UI任务将是:
product.PriceCategory.PriceChoices
product.PriceChoice
(或将选定的Id值存储到product.PriceChoiceId
)随意询问这是否不足以解决您的问题。
关于为每行的组合框绑定单个ItemsSource的问题:
There is a solution涉及DataGridComboBoxColumn.ElementStyle
和DataGridComboBoxColumn.EditingElementStyle
而不是DataGridComboBoxColumn.ItemsSource
<DataGridComboBoxColumn Header="Price" SelectedItemBinding="{Binding PriceChoice}" DisplayMemberPath="Name">
<!-- Work around the requirement for static binding sources inside DataGridComboBoxColumn.ItemsSource -->
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding PriceCategory.PriceChoices}"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding PriceCategory.PriceChoices}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>