2017-02-08 7 views
1

Привет привет всем
У меня недавно была проблема.
Я попытался поставить один datagrid в другой datagrid.
Главный datagrid имеет два столбца - текст и шаблон (здесь я помещаю еще один datagrid). Внутренний datagrid имеет один текстовый столбец.
Проблема проявляется, когда высота текстовой ячейки главного DG превышает общую высоту внутренних DG-клеток.
Что-то вроде этого:
Image
Мой вопрос: могу ли я что-нибудь сделать с серым прямоугольником? Могу ли я разделить серой высоту между строками? Или простые строки растяжения?
Или есть лучший способ сделать это? Не только двухуровневый набор данных, но и 3,4,5-уровня и для более сложных данных.WPF стрейч строк вертикально

Простой пример:
окна: за

<DockPanel> 
    <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False" HeadersVisibility="None" CanUserAddRows="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Path=Col1}" Width="*"/> 
      <DataGridTemplateColumn Width="*"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <DataGrid ItemsSource="{Binding Path=Col2}" AutoGenerateColumns="False" HeadersVisibility="None" CanUserAddRows="False"> 
          <DataGrid.Columns> 
           <DataGridTextColumn Binding="{Binding}" Width="*"/> 
          </DataGrid.Columns> 
         </DataGrid> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 
</DockPanel> 

Код:

public class Test1 : NotifyPropertyClass 
{ 

    private string col1; 
    public string Col1 
    { 
     get { return col1; } 
     set { col1 = value; OnPropertyChanged("Col1"); } 
    } 
    private List<string> col2; 
    public List<string> Col2 
    { 
     get { return col2; } 
     set { col2 = value; OnPropertyChanged("Col2"); } 
    } 
} 

public ObservableCollection<Test1> dc; 

public MainWindow() 
{ 
    dc = new ObservableCollection<Test1>() 
     { 
      new Test1() { Col1 = "00" + Environment.NewLine + Environment.NewLine + Environment.NewLine + Environment.NewLine + "00", 
          Col2 = new List<string>() { "123", "456"} } 
     }; 
    DataContext = dc; 
    InitializeComponent(); 
} 
+0

Вы можете избавиться от серого цвета, просто установив Фоновая свойство DataGrid, но я предполагаю, что вы хотите больше, чем это? – mm8

+0

@ mm8 Да, я хочу растянуть строки по вертикали. Цвет не имеет значения. –

+0

См. Мой ответ. – mm8

ответ

1

Если вы хотите растянуть строки по вертикали можно использовать конвертер, который связывается с родителем (внутренний) DataGrid и устанавливает высоту контейнеров DataGridRow на основании высоты DataGrid:

namespace WpfApplication1 
{ 
    public class RowHeightConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      DataGrid dg = value as DataGrid; 
      if(dg != null && dg.Items.Count > 0) 
      { 
       return dg.ActualHeight/dg.Items.Count; 
      } 

      return 20; //return some default height 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotSupportedException(); 
     } 
    } 
} 

Пример использования:

<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False" HeadersVisibility="None" CanUserAddRows="False" 
         xmlns:local="clr-namespace:WpfApplication1"> 
    <DataGrid.Resources> 
     <local:RowHeightConverter x:Key="conv" /> 
    </DataGrid.Resources> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Path=Col1}" Width="*"/> 
     <DataGridTemplateColumn Width="*"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <DataGrid ItemsSource="{Binding Path=Col2}" AutoGenerateColumns="False" HeadersVisibility="None" CanUserAddRows="False"> 
         <DataGrid.ItemContainerStyle> 
          <Style TargetType="DataGridRow"> 
           <Setter Property="Height" Value="{Binding Path=., RelativeSource={RelativeSource AncestorType=DataGrid}, 
               Converter={StaticResource conv}}" /> 
          </Style> 
         </DataGrid.ItemContainerStyle> 
         <DataGrid.Columns> 
          <DataGridTextColumn Binding="{Binding}" Width="*"/> 
         </DataGrid.Columns> 
        </DataGrid> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

enter image description here

+0

Спасибо за ответ! –