WPF垂直拉伸行

时间:2017-02-08 18:47:48

标签: c# wpf datagrid

你好,大家好 我最近遇到了一个问题 我尝试将一个数据网格放入另一个数据网格中 主数据网格有两列 - 文本和模板(这里我放了另一个数据网格)。内部数据网格有一个文本列 当主DG文本单元的高度超过内部DG单元的总高度时,问题就出现了 这样的事情:
Image
我的问题是:我可以用灰色矩形做点什么吗?我可以在行之间平均分配灰色高度吗?还是简单的拉伸行? 或者有更好的方法吗?不仅是2级数据网格,而且是3,4,5级和更复杂的数据网格。

简单的例子:
窗口:

<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();
}

1 个答案:

答案 0 :(得分:1)

如果要垂直拉伸行,可以使用绑定到父(内部)DataGrid的转换器,并根据{{的高度设置DataGridRow项容器的高度1}}:

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();
        }
    }
}

enter image description here