DataGrid 컨트롤을 사용하는 경우 행 세부 정보 섹션을 추가하여 데이터 프레젠테이션을 사용자 지정할 수 있습니다. 행 세부 정보 섹션을 추가하여 템플릿에서 선택적으로 표시되거나 축소되는 일부 데이터를 그룹화할 수 있습니다. 예를 들어 DataGrid에 행 세부 정보를 추가하여 DataGrid에서 각 행의 데이터에 대한 요약 정보만 표시하고 사용자가 행을 선택하는 경우 더 많은 데이터 필드를 나타낼 수 있습니다. RowDetailsTemplate 속성에 행 세부 정보 섹션에 대한 템플릿을 정의합니다. 다음 그림에서는 행 세부 정보 섹션의 예를 보여 줍니다.
행 세부 정보 템플릿을 인라인 XAML 또는 리소스로 정의합니다. 다음 절차에서는 두 방법을 모두 보여 줍니다. 템플릿을 다시 만들지 않고 리소스로 추가되는 데이터 템플릿을 프로젝트 전체에서 사용할 수 있습니다. 인라인 XAML로 추가되는 데이터 템플릿은 정의된 컨트롤에서만 액세스할 수 있습니다.
인라인 XAML을 사용하여 행 세부 정보를 표시하려면
데이터 소스에서 데이터를 표시하는 DataGrid를 만듭니다.
DataGrid 요소에서 RowDetailsTemplate 요소를 추가합니다.
행 세부 정보 섹션의 모양을 정의하는 DataTemplate을 만듭니다.
다음 XAML은 DataGrid를 보여 주고 RowDetailsTemplate을 인라인으로 정의하는 방법을 보여 줍니다. DataGrid의 각 행에는 세 개의 값이 표시되고 행을 선택하면 세 개의 값이 더 표시됩니다.
<Window x:Class="WpfApplication1.MainWindow" xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded"> <Grid> <DataGrid Name="dataGrid1" IsReadOnly="True" AutoGenerateColumns="False" > <DataGrid.Columns> <DataGridTextColumn Header="Company Name" Binding="{Binding CompanyName}"></DataGridTextColumn> <DataGridTextColumn Header="Contact First Name" Binding="{Binding FirstName}"></DataGridTextColumn> <DataGridTextColumn Header="Contact Last Name" Binding="{Binding LastName}"></DataGridTextColumn> </DataGrid.Columns> <DataGrid.RowDetailsTemplate> <DataTemplate> <Border BorderThickness="0" Background="BlanchedAlmond" Padding="10"> <StackPanel Orientation="Vertical"> <StackPanel Orientation="Horizontal"> <TextBlock FontSize="12" Text="Email: " VerticalAlignment="Center" /> <TextBlock FontSize="16" Foreground="MidnightBlue" Text="{Binding EmailAddress}" VerticalAlignment="Center" /> </StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock FontSize="12" Text="Phone: " VerticalAlignment="Center" /> <TextBlock FontSize="16" Foreground="MidnightBlue" Text="{Binding Phone}" VerticalAlignment="Center" /> </StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock FontSize="12" Text="Sales Person: " VerticalAlignment="Center" /> <TextBlock FontSize="16" Foreground="MidnightBlue" Text="{Binding SalesPerson}" VerticalAlignment="Center" /> </StackPanel> </StackPanel> </Border> </DataTemplate> </DataGrid.RowDetailsTemplate> </DataGrid> </Grid> </Window>
다음 코드에서는 DataGrid에 표시되는 데이터를 선택하는 데 사용되는 쿼리를 보여 줍니다. 이 예제의 쿼리에서는 고객 정보가 들어 있는 엔터티에서 데이터를 선택합니다.
Dim advenWorksEntities As AdventureWorksLT2008Entities = New AdventureWorksLT2008Entities Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded Dim customers As ObjectQuery(Of Customer) = advenWorksEntities.Customers Dim query = _ From customer In customers _ Order By customer.CompanyName _ Select _ customer.LastName, _ customer.FirstName, _ customer.CompanyName, _ customer.Title, _ customer.EmailAddress, _ customer.Phone, _ customer.SalesPerson dataGrid1.ItemsSource = query.ToList() End Sub
private void Window_Loaded(object sender, RoutedEventArgs e) { AdventureWorksLT2008Entities advenWorksEntities = new AdventureWorksLT2008Entities(); ObjectQuery<Customer> customers = advenWorksEntities.Customers; var query = from customer in customers orderby customer.CompanyName select new { customer.LastName, customer.FirstName, customer.CompanyName, customer.Title, customer.EmailAddress, customer.Phone, customer.SalesPerson }; dataGrid1.ItemsSource = query.ToList(); }
리소스를 사용하여 행 세부 정보를 표시하려면
데이터 소스에서 데이터를 표시하는 DataGrid를 만듭니다.
Resources 요소를 루트 요소(예: Window 컨트롤 또는 Page 컨트롤)에 추가하거나 Resources 요소를 App.xaml 또는 Application.xaml 파일의 Application 클래스에 추가합니다.
리소스 요소에서 행 세부 정보 섹션의 모양을 정의하는 DataTemplate을 만듭니다.
다음 XAML에서는 Application 클래스에 정의된 RowDetailsTemplate을 보여 줍니다.
<Application.Resources> <DataTemplate x:Key="CustomerDetail"> <Border BorderThickness="0" Background="BlanchedAlmond" Padding="10"> <StackPanel Orientation="Vertical"> <StackPanel Orientation="Horizontal"> <TextBlock FontSize="12" Text="Email: " VerticalAlignment="Center" /> <TextBlock FontSize="16" Foreground="MidnightBlue" Text="{Binding EmailAddress}" VerticalAlignment="Center" /> </StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock FontSize="12" Text="Phone: " VerticalAlignment="Center" /> <TextBlock FontSize="16" Foreground="MidnightBlue" Text="{Binding Phone}" VerticalAlignment="Center" /> </StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock FontSize="12" Text="Sales Person: " VerticalAlignment="Center" /> <TextBlock FontSize="16" Foreground="MidnightBlue" Text="{Binding SalesPerson}" VerticalAlignment="Center" /> </StackPanel> </StackPanel> </Border> </DataTemplate> </Application.Resources>
DataTemplate에서 x:Key 지시문를 데이터 템플릿을 고유하게 식별하는 값으로 설정합니다.
DataGrid 요소에서 RowDetailsTemplate 속성을 이전 단계에서 정의한 리소스로 설정합니다. 리소스를 정적 리소스로 할당합니다.
다음 XAML에서는 이전 예제에서 리소스로 설정한 RowDetailsTemplate 속성을 보여 줍니다.
<DataGrid Name="dataGrid1" IsReadOnly="True" AutoGenerateColumns="False" RowDetailsTemplate="{StaticResource CustomerDetail}" > <DataGrid.Columns> <DataGridTextColumn Header="Company Name" Binding="{Binding CompanyName}"></DataGridTextColumn> <DataGridTextColumn Header="Contact First Name" Binding="{Binding FirstName}"></DataGridTextColumn> <DataGridTextColumn Header="Contact Last Name" Binding="{Binding LastName}"></DataGridTextColumn> </DataGrid.Columns> </DataGrid>
행 세부 정보에 대한 표시 유형을 설정하고 가로 방향으로 스크롤되지 않도록 하려면
필요한 경우 RowDetailsVisibilityMode 속성을 DataGridRowDetailsVisibilityMode 값으로 설정합니다.
기본적으로 값은 VisibleWhenSelected로 설정되어 있습니다. 값을 Visible로 설정하여 모든 행에 대한 세부 정보를 표시하거나 Collapsed로 설정하여 모든 행에 대한 세부 정보를 숨길 수 있습니다.
필요한 경우 AreRowDetailsFrozen 속성을 true로 설정하여 행 세부 정보 섹션이 가로 방향으로 스크롤되지 않도록 할 수 있습니다.