WPF связывает столбец DataGrid ComboBox из таблицы базы данных, используя идентификатор - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть классы

[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; }
}

и мне нужно создать столбец DataGrid как ComboBox, используя CategoryID из продуктов, и поместить все категории в ComboBox из категорий для редактирования, как я могу сделать это с помощью DataContext

1 Ответ

0 голосов
/ 13 ноября 2018

Здесь я создал ObservableCollection продукта и категории с именем ProductSet & ListOfCategory на уровне окна.

public ObservableCollection<Category> ListOfCategory { get; set; }
public ObservableCollection<Product> ProductSet  { get; set; }

Я создал оба объекта ObservableCollection в коде за окном. Вы можете создать модель в представлении, которая лучше подходит.

Я назвал окно "Window1" x: Name = "Window1"

Поскольку вам необходимо связать контекст данных, сделал elementBinding с Window1, а также установил ItemsSource = "{Binding ProductSet}". Итак, что здесь происходит, так это то, что в ProuctSet выполняется поиск DataContext, который, в свою очередь, ищется внутри класса Window1.

Для DataGridComboBoxColumn установите ItemsSource, используя Стиль, и найдите Datagrid DataContext, у которого ListOfCategory, используя Относительный источник.

<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}"></DataGridTextColumn>
            <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>
        <DataGridTextColumn Header="Price " Width="175" Binding="{Binding Price }"></DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

Если вы собираетесь связывать с использованием модели представления, укажите имя класса модели представления вместо привязки элемента.

...