C# Столбец шаблона таблицы данных WPF с комбинированным списком, имеющим другой источник данных - PullRequest
2 голосов
/ 11 апреля 2020

enter image description here У меня есть окно с 2 элементами управления. Один - это комбинированный список (cmbUnit), а другой - DataGrid (dgvProducts)

cmbUnits, связанный с коллекцией List<Unit>, а класс Unit ниже

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

Примечание. Отображаемым элементом является имя, а значением - идентификатор.

Где, как, dgvProducts связан с List<Product> Коллекция и Product класс ниже

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

Здесь я выбираю UnitID из моей таблицы БД (TBL_PRODUCTS), я также могу получить UnitName, присоединившись к таблице. на данный момент я хочу оставить только UnitID в своем классе Product.

Мой вопрос состоит в том, что у моей таблицы данных есть столбец (datagridTemplateColumn) со списком в качестве дочернего элемента, и я хочу показать UnitName внутри него, передав UnitID то же, что и мой элемент управления списком (cmbUnit)

Мои данные внутри сетки данных должны быть

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

Где Kg должно быть отображается внутри комбинированного списка. Как этого добиться? Помогите мне!

Мой код XAML для cmbUnit -

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

Спасибо

1 Ответ

0 голосов
/ 12 апреля 2020

Если у вас есть

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

Обратите внимание, что ComboBox внутри DataGrid имеет свой собственный DataContext, который содержит элемент ItemsSource вашего DataGrid. Кроме того, он является частью DataTemplate, что означает, что он не является самим объектом, поэтому вы не можете напрямую связываться с ним из кода позади.

...