Master / Detail DataGrid. Как получить доступ к Detail DataGrid для установки ItemsSource? - PullRequest
2 голосов
/ 01 сентября 2011

В типичной ситуации Master / Detail ...

У меня есть DataGrid. ItemsSource этого DataGrid устанавливается в событии Completed вызова WCF - (grdMaster.ItemsSource = e.Result), где x: имя сетки - grdMaster. Это все 100%.

Тем не менее, при добавлении Детальной сетки данных в главные сетки DataTemplate и присвоении ему соответствующего имени ... мой код не распознает детальную сетку. Проще говоря, я не могу установить ItemsSource для grdDetail, как для grdMaster.

В зависимости от выбранного главного элемента мне нужно сделать вызов WCF, чтобы получить соответствующие сведения.

1 Ответ

2 голосов
/ 04 октября 2011

В зависимости от того, как вы получаете уведомление о выборе элемента для расширения, вам нужно будет найти строку, в которой находится пользователь:

DataGridRow row = DataGridRow.GetRowContainingElement(...);

и обновить видимость деталей строки:

row.DetailsVisibility = Visibility.Visible;

Помимо этих деталей, вам нужно создать стиль для строк с подробностями, который связан с событием, которое вы можете прослушать:

<DataTemplate x:Key="DetailsRowTemplate">
    <StackPanel>
        <Border BorderBrush="{StaticResource BlackBrush}" BorderThickness="0,2,0,0" Padding="0" >
            <data:DataGrid ItemsSource="{Binding DummyResultsView}" AutoGenerateColumns="False"
                            LoadingRow="DataGrid_LoadingRow" 
                            CanUserResizeColumns="False" 
                            CanUserReorderColumns="False"
                            HeadersVisibility="None"
                            IsReadOnly="True">
            </data:DataGrid>
        </Border>
    </StackPanel>
</DataTemplate>

, который устанавливается как шаблон RowDetailsTemplate для вашей сетки:

В событии LoadingRow вы можете получить ссылку на контекст данных и сохранить ссылку на дочернюю сетку данных, чтобы после вызова WCF вы могли установить ItemsSource:

private void DataGrid_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e)
{
    List<DataGrid> detailElements = e.DetailsElement.GetChildrenByType<System.Windows.Controls.DataGrid>().ToList();

    var itemSelected = e.Row.DataContext;

    if (detailElements.Count > 0)
    {
        DataGrid detailsDataGrid = detailElements[0];

        // save a reference so the ItemsSource can be set later....
        this.DataGrid = detailsDataGrid;

        this.Model.InitializeDetailsList(detailsDataGrid, itemSelected);
    }
}

Надеюсь, это поможет,

...