在DataGridComboBoxColumn中显示多级相关数据

时间:2018-02-14 13:05:56

标签: wpf entity-framework

我有一个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价格类别,但现在它显示所有价格类别。新价格应作为价格更新,并显示在数据网格的价格列中。

enter image description here

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>

表格:

价目表行

  • 价格
  • 产品ID(fk)
  • 价目表ID(fk)

价目表

  • 编号

价格类别

  • 编号
  • 名称

价格选择

  • 编号
  • 名称
  • 价格类别ID(fk)

产品

  • 编号
  • 名称
  • 价格类别ID(fk)

1 个答案:

答案 0 :(得分:0)

如果需要,我将从部分答案开始并更新。

所以我对你的要求的理解如下:

  1. 您有Product
  2. 的列表
  3. 每个Product都有PriceCategory
  4. 每个PriceCategory都有一个有效PriceChoice
  5. 的列表
  6. 每个Product都有一个当前选定的PriceChoice选项,需要属于正确的PriceCategory
  7. 数据库设计中的执行点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 rowPrice list是什么,根据上面列出的要求,它们与数据库模型无关。

    因此,当处理单个product时,要完成的UI任务将是:

    • 使用可选项product.PriceCategory.PriceChoices
    • 显示组合框
    • 将所选项目存储到product.PriceChoice(或将选定的Id值存储到product.PriceChoiceId

    随意询问这是否不足以解决您的问题。

    关于为每行的组合框绑定单个ItemsSource的问题:

    There is a solution涉及DataGridComboBoxColumn.ElementStyleDataGridComboBoxColumn.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>