DataGrid в качестве RowDetailsTemplate

163
14 июля 2017, 02:06

Есть DataGrid, при выборе строки которого выпадает RowDetailsTemplate, в DataTemplate указан еще один DataGrid. Суть в том что грид внутри DataTemplate привязан к ObservableCollection и должен отображать некоторую информацию в зависимости от выбранной строки основного DataGrid. Собственно разметка :

 <DataGrid x:Name="first" IsReadOnly="True" AutoGenerateColumns="False" RowHeight="30" GridLinesVisibility="None" ItemsSource="{Binding ClientListCollection}" SelectedValue="{Binding KlientForDetails, Mode=OneWayToSource}">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectionChanged">
                    <i:InvokeCommandAction Command="{Binding SelectKlientForDetails}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding NameSimple}" Width="*" />
                <DataGridTextColumn Binding="{Binding order}" MinWidth="100" Width="100"/>
            </DataGrid.Columns>
            <DataGrid.RowDetailsTemplate>
                <DataTemplate>
                    <Grid>
                        <DataGrid x:Name="second" IsReadOnly = "True" AutoGenerateColumns="False" RowHeight="20" Height="100" ItemsSource="{Binding klientDetails,Mode=TwoWay}">
                            <DataGrid.Columns>
                                <DataGridTextColumn Binding ="{Binding title}" Width="100" />
                                <DataGridTextColumn Binding="{Binding value}" Width="*"/>
                            </DataGrid.Columns>
                        </DataGrid>
                    </Grid>
                </DataTemplate>
            </DataGrid.RowDetailsTemplate>
        </DataGrid>

Проблема в том, что при выборе строки first грида грид second разворачивается но совершенно пустым.

Однако если вывести second из под RowDetailsTemplate - заполняется как положено(т.е. дело не во вьюмо дели).

Можно конечно сделать 2 грида где один показывает просто список обьектов, а второй детальную информацию по нему но хочется именно что бы при выборе строки, с RowDetailsTemplate. Как исправить эту разметку?

Answer 1

У меня есть предположение, что это происходит из-за размеров контейнера, в котором размещен основной DataGrid. Поэтому как обещал в коментариях привожу разметку окна.

XAML код:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:viewModel="clr-namespace:WpfApplication4.ViewModel"
        Title="MainWindow"
        Width="500"
        Height="500"
        mc:Ignorable="d">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <DataGrid AutoGenerateColumns="False"
                  IsReadOnly="True"
                  ItemsSource="{Binding ClientListCollection}">
            <DataGrid.Columns>
                <DataGridTextColumn Width="*"
                                    Binding="{Binding NameSimple}" />
                <DataGridTextColumn Width="100"
                                    MinWidth="100"
                                    Binding="{Binding Order}" />
            </DataGrid.Columns>
            <DataGrid.RowDetailsTemplate>
                <DataTemplate DataType="{x:Type viewModel:ParentViewModel}">
                    <DataGrid AutoGenerateColumns="False"
                              IsReadOnly="True"
                              ItemsSource="{Binding Details}">
                        <DataGrid.Columns>
                            <DataGridTextColumn Width="100"
                                                Binding="{Binding Title}" />
                            <DataGridTextColumn Width="*"
                                                Binding="{Binding Value}" />
                        </DataGrid.Columns>
                    </DataGrid>
                 </DataTemplate>
             </DataGrid.RowDetailsTemplate>
         </DataGrid>
         <Button Grid.Row="1"
                 Command="{Binding DoCommand}"
                 Content="Тыц" />
    </Grid>
</Window>

а так же ViewModel

public class ParentViewModel : ViewModelBase
{
    public string NameSimple { get; set; } // INPC
    public string Order { get; set; } // INPC
    public ObservableCollection<DetailsViewModel> Details { get; set; }
    public ParentViewModel()
    {
        Details = new ObservableCollection<DetailsViewModel>();
    }
}
public class DetailsViewModel : ViewModelBase
{
    public string Title { get; set; } // INPC
    public int Value { get; set; } // INPC
}
public class MainViewModel : ViewModelBase
{
    public ObservableCollection<ParentViewModel> ClientListCollection { get; set; }
    public MainViewModel()
    {
        ClientListCollection = new ObservableCollection<ParentViewModel>();
        // Заполняем данными ClientListCollection...
    }
}

P.S. Некоторый вещи для вроде EventTrigger убраны для того что бы не загромождать код.

READ ALSO
Файл конфигурации в .net core

Файл конфигурации в .net core

Подскажите, как вnet core создавать и использовать файл кофигурации (то что в

233
отображение данных с json на spa

отображение данных с json на spa

Вот реализация перехода по страницам с помощью хэша:

269
LongPolling в jasmine-ajax

LongPolling в jasmine-ajax

Как можно ответить на запрос к примеру три раза по разномуПервый запрос один ответ, второй запрос на тот же адрес другой ответ и третий запрос...

351
ошибка 404 в express при запросе

ошибка 404 в express при запросе

запрос выдает ошибку 404 с комментарием "Not found"В качестве бд использую Mongoose

259