具有不同数据源的组合框的 C# WPF 数据网格模板列

C# WPF datagrid template column with combobox having different datasource

我有一个带有 2 个控件的 window。一个是组合框 (cmbUnit),另一个是 DataGrid (dgvProducts)

cmbUnitsList<Unit> 集合绑定并且 Unit class 在

下方
public class Unit
{
   public int ID { get; set; }
   public string Name { get; set; }
}

注意:显示成员是名称&值成员是ID

其中,dgvProductsList<Product> 集合绑定,Product class 在下方

public class Product
{
       public int ID { get; set; }
       public string ProductName { get; set; }
       public int UnitID { get; set; }
}

在这里,我从我的数据库table (TBL_PRODUCTS)中选择UnitID,我也可以通过加入table来检索UnitName。现在,我只想在 Product class.

中保留 UnitID

我的问题是,我的数据网格有一个列 (datagridTemplateColumn),其中有一个组合框作为子项,我想通过像我的组合框一样传递 UnitID 来显示其中的 UnitName控制 (cmbUnit)

我在数据网格中的数据应该是

--------------------------------------------------
ID      UnitName     ProductName
--------------------------------------------------
12345    Kg         Sample Product

其中 Kg 应显示在组合框内。 如何做到这一点?帮帮我!

cmbUnit 的 XAML 代码是

<ComboBox Grid.Column="7" Grid.Row="1" Name="cmbUnit" ></ComboBox>

我从后面的代码将数据绑定到这个控件。

XAML 对于 dgvProducts

<DataGrid AutoGenerateColumns="False" Grid.ColumnSpan="2"
              Name="dgvProduct"  
              Grid.Row="2">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="ID" Width="50" CanUserSort="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Label VerticalContentAlignment="Center" Content="{Binding ID}"></Label>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Unit" Width="*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox IsEnabled="False"
                            Name="cmbGrUnit"
                            ItemsSource="{Binding Units}"
                            DisplayMemberPath="Name"
                            SelectedValuePath="ID"
                            SelectedValue="{Binding UnitID}"
                            ></ComboBox>
                        <!--<Label VerticalContentAlignment="Center" Content="{Binding Name}"></Label>-->
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Product Name" Width="*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Label VerticalContentAlignment="Center" Content="{Binding ProductName}"></Label>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn></DataGrid.Columns>

谢谢

当你有

<ComboBox Grid.Column="7" Grid.Row="1" Name="cmbUnit" ></ComboBox>

从后面的代码中设置 ItemsSource

cmbUnit.ItemsSource = this.Units

然后您可以通过以下方式使用此 cmbUnit 作为绑定的源对象:

<DataGridTemplateColumn Header="Unit" Width="*">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding Path=ItemsSource, ElementName=cmbUnit}"
                    SelectedValuePath="ID" DisplayMemberPath="Name" SelectedValue="{Binding Path=UnitID}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

请注意,DataGrid 中的 ComboBox 有自己的 DataContext,其中包含 DataGrid 的 ItemsSource 的一个元素。此外,它是 DataTemplate 的一部分,这意味着它本身不是一个对象,因此您不能从后面的代码直接绑定到它。