2017-02-08 5 views
1

こんにちは皆さん
最近問題が1つあります。
私は1つのDataGridを別のDataGridに配置しようとしました。
メインDataGridには、textとtemplateの2つのカラムがあります(ここでは別のDataGridを配置します)。内部のDataGridには1つのテキスト列があります。
メインDGテキストセルの高さが内側のDGセルの合計高さを超えると、問題が発生します。
このようなもの:
Image
私の質問は:灰色の長方形で何かできますか?行間のグレーの高さを均等に分割できますか?または単純なストレッチ行ですか?
これを行うにはより良い方法がありますか? 2レベルのデータグリッドだけでなく、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

あなたは、単にデータグリッドの背景プロパティを設定することで、グレー色を取り除くことができますが、私はあなたがこれよりももっと欲しいと思いますか? – mm8

+0

@ mm8はい、行を縦方向に伸ばしたいと思います。色は関係ありません。 –

+0

私の答えを参照してください。 – mm8

答えて

1

あなたが垂直方向に行をストレッチする場合は、親に結合するコンバータ(インナー)DataGridを使用することができますDataGridの高さに基づいてDataGridRowアイテムコンテナの高さを設定します。

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

お返事ありがとうございます! –

関連する問題