2017-02-08 105 views
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

您可以通過簡單的設置DataGrid的背景屬性擺脫了灰色的,但我想你想比這更? – 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

感謝您的回答! –