2014-01-15 2 views
1

Привет Iam помощью вложенной DataGrid и следующее его определение, Вот скриншот вывода,Уплотненный Datagrid работает

enter image description here

В изображении выше, у меня есть 2 DataGrids. Если я нажму на любую строку outergrid, отобразится соответствующая внутренняя часть. Теперь я не понимаю, как обрабатывается это событие, и отображаются соответствующие внутренние данные сетки.

Это классовая структура, к которой И связывание моего DataGrid,

class MyClass 
    { 
     public string Col1{ get; set; } 
     public string Col2{ get; set; } 
     public string Col3{ get; set; } 
     public string Col4{ get; set; } 
     public string Col5{ get; set; } 
     public ObservableCollection<InnerObject> inner_object{ get; set; } 
    } 

class InnerObject 
{ 
    public string EventName { get; set; } 
    public string Date { get; set; } 
    public string Time { get; set; } 
    public string Message { get; set; } 
    public int RIndex { get; set; } 
} 
<DataGrid 
     x:Name="objDatagrid" 
     ItemsSource="{Binding DataView}" 
     CanUserAddRows="False" 
     CanUserDeleteRows="False" 
     AutoGenerateColumns="False" 
     BorderBrush="Gray" 
      > 
      <DataGrid.RowStyle> 
       <Style TargetType="{x:Type DataGridRow}"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding TDate}" Value=""> 
          <Setter Property="Visibility" Value="Collapsed"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </DataGrid.RowStyle> 
      <DataGrid.RowDetailsTemplate > 
       <DataTemplate> 


         <DataGrid 
      x:Name="objInnerDatagrid" 
      IsReadOnly="True" 
      ItemsSource="{Binding ElementName=objDatagrid, Path=SelectedItem.inner_object}"> 
          <DataGrid.RowStyle> 
<Style TargetType="{x:Type DataGridRow}"> 
            <Style.Triggers> 
             <DataTrigger Binding="{Binding Date}" Value=""> 
              <Setter Property="Visibility" Value="Collapsed"/> 
             </DataTrigger> 
            </Style.Triggers> 
           </Style> 
          </DataGrid.RowStyle> 
          <DataGrid.Columns> 
          </DataGrid.Columns> 
         </DataGrid> 
       </DataTemplate> 
      </DataGrid.RowDetailsTemplate> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Col1" Width="SizeToHeader" Binding="{Binding Col1}" IsReadOnly="True"/> 
       <DataGridTextColumn Header="Col2" Width="80" Binding="{Binding Col2}" IsReadOnly="True"/> 
       <DataGridTextColumn Header="Col3" Width="80" Binding="{Binding Col3}" IsReadOnly="True"/> 
       <DataGridTextColumn Header="Col4" Width="120" Binding="{Binding Col4}" IsReadOnly="True"/> 
       <DataGridTextColumn Header="Col5" Width="100" Binding="{Binding Col5}" IsReadOnly="True"/> 
      </DataGrid.Columns> 
     </DataGrid> 

Iam новичок в WPF. Может ли кто-нибудь объяснить мне приведенный выше код и его работу? Это будет отличная помощь. Спасибо заранее.

ответ

2

Как вы уже видите в коде RowDetailsTemplate отображает внутреннюю сетку. Поведение по умолчанию для отображения информации о строках - это когда кто-то выбирает родительскую строку.

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

Посмотреть этот пост для более подробной информации ...

Show RowDetails on double-click in WPF DataGrid

+0

Большое спасибо. Ур помог. Я просто хочу знать, могу ли я создать ту же структуру datagrid программно со всеми этими RowDetailsTemplate – Surjeet

3

DataGrid.RowDetailsVisibilityMode определяет, когда отображается строка с данными, и DataGrid.RowDetailsTemplate определяет то, что показано.

По умолчанию раздел детали строки отображается для выбранных строк, если RowDetailsTemplate определяется

Это работает, потому что вы связываете внутренний DataGrid.ItemsSource к inner_object из SelectedItem - в вашем случае MyClass - из objDatagrid управления

ItemsSource="{Binding ElementName=objDatagrid, Path=SelectedItem.inner_object}"> 

Существует, однако, потенциальная проблема с этим. Он всегда связывается с первым выбранным элементом, а не с тем, который вы открыли в данный момент. Например, когда DataGrid.RowDetailsVisibilityMode = Visible все данные будут указывать на один и тот же выбор элементов. Так как для каждой строки DataContext, который включает в себя детали строки, уже будет установлено на экземпляр MyClass все, что вы должны сделать, это:

ItemsSource="{Binding Path=inner_object}"> 

на внутренней DataGrid

+0

Благодарим за подробное объяснение. Я просто хочу знать, могу ли я создать ту же структуру datagrid программно со всеми этими RowDetailsTemplate – Surjeet

+1

, вы имеете в виду «... все, что вам нужно сделать, это:« ItemsSource = »{Binding inner_object}"> '" – mcalex

+0

@mcalex yes. Хорошо подмечено. Спасибо. Сейчас исправлено – dkozl

Смежные вопросы