Как отобразить связанные данные из набора данных в сетке данных wpf

У меня есть набор данных с двумя таблицами, между которыми происходят простые отношения между родителями и детьми. например;

Parent Table
ParentId (int)
Name     (string)

Child Table
ChildId (int)
ParentId (int)
Name     (string)

В этом наборе данных у меня установлена ​​связь (ParentChildRelation) между родителем и потомком в поле родительского идентификатора. И если я программно выполняю вызов Parent.getChildRows(), я вижу правильные связанные дочерние записи, поэтому я знаю, что отношения хорошие.

Мне нужно отобразить сетку данных со списком родительских строк и иметь другую отдельную сетку данных, отображающую список дочерних записей для выбранного родителя.

Пока на моем окне в коде позади, у меня есть

private DataSet _parentChildDataSet;
public DataSet ParentChildDataSet
{
    get
    {
        return _parentChildDataSet;
    }
    set 
    {
        _parentChildDataSet = value;
    }


    public DataView ParentView
    {
        get
        {
            return this.ParentChildDataSet.Tables["Parent"].DefaultView;
        }
    }

    public DataRelation ParentChildRelation
    {
        get
        {
            return this.ParentChildDataSet.Relations["Parent_Child"] ;
        }
    }

Я также установил datacontext для окна в конструктор windows, например;

this.DataContext = this;

и в моем xaml

<Grid>
    <DataGrid ItemsSource="{Binding Path=ParentView}" AutoGenerateColumns="True" Name="dataGrid1">
    </DataGrid>
    <DataGrid ItemsSource="{Binding Path=ParentChildRelation}" Name="dataGrid2" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Path=Name}" Header="Name" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

Однако я не могу получить какие-либо дочерние записи для отображения в dataGrid2.

Я связываю эту сетку с именем datarelation это правильно?

если я связываюсь с другим свойством в моем окне;

    public DataView ChildrenView
    {
        get
        {
            return this.ParentChildDataSet.Tables["Child"].DefaultView;
        }
    }

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

Спасибо за любые подсказки, которые каждый может дать мне.

2 ответа

Решение

Когда вы возвращаете DataView, он работает, но отображает все.

Здесь вы возвращаете DataRelation

ItemsSource="{Binding Path=ParentChildRelation}" 

Вам нужно вернуть DataView

Используйте отношение для создания DataView

Метод DataRowView.CreateChildView (DataRelation)

Я не могу выработать принятый ответ. Моя ситуация идентична описанной здесь: 2 таблицы, отношения, 2 датагрид.

Я изучил метод CreateChildView, но мне не хватает ключевой точки где-то. Мой текущий код для получения дочернего вида:

public DataView ChildView {
    get {
        return ParentChildRelation.ParentTable.DefaultView[0].CreateChildView("regels")
    }
}

Проблема двоякая, во-первых, у меня, очевидно, фиксированный индекс, то есть я всегда получаю дочернее представление первой строки родительской таблицы. Во-вторых, я с треском проваливаюсь при получении нового дочернего представления, когда в родительском представлении выбирается новая строка (ChildView вызывается только при инициализации).

Мой XAML:

<Grid>
    <DataGrid
        ItemsSource="{Binding Path=ParentView}"
        AutoGenerateColumns="True"
        Name="dataGrid1" 
    />

    <DataGrid
        ItemsSource="{Binding Path=ChildView}"
        AutoGenerateColumns="True"
        Name="dataGrid2"
    />
</Grid>

Я хотел бы сделать это решением XAML и избегать написания обработчиков событий, обновляющих childview. Я пытался поиграться с DataContext, но нигде не нашел, документация о том, как использовать эту структуру с наборами данных и связями, очень скудна (заставляет задуматься, иду ли я по правильному пути).

Другие вопросы по тегам