从代码背后绑定高度

时间:2011-12-27 12:38:12

标签: c# .net wpf .net-4.0

我有一个由Grid面板组成的自定义GridView控件,每个行都有几个控件(所有这些都来自System.Windows.Controls)。

用户请求行高度不受控件内容的限制。我有一个问题是要保持每行中所有控件的大小与最高控件的大小相关。

我正在尝试将每行中所有控件的高度单向绑定到RowDefenition ActualHeight属性。但它没有按预期工作(每个控件都将它自己的大小保持在最低限度)

任何帮助将不胜感激,谢谢。

以下是我试图绑定的代码:

                RowDefinition rowDef = new RowDefinition();

                cellsGrid.RowDefinitions.Add(rowDef);
                rowDef.Name = "gvRow" + cellsGrid.RowDefinitions.Count;

                cellsGrid.Children.Add(controlToAdd);
                Grid.SetRow(controlToAdd, rowIndex);
                Grid.SetColumn(controlToAdd, columnIndex);

                Binding bindH = new Binding("ActualHeight");
                bindH.Mode = BindingMode.OneWay;
                bindH.Source = rowDef;
                BindingOperations.SetBinding(controlToAdd,RowDefinition.HeightProperty, bindH);

                controlToAdd.TabIndex = (totalTabIndex + 1); totalTabIndex++;
                cell.CellElement = controlToAdd;
                cell.EndEdit += new GridViewCell.GridViewEditHandler(cell_EndEdit);

4 个答案:

答案 0 :(得分:1)

尝试将您的控件的VerticalAlignment设置为Stretch,然后展开以填充所有可用空间。

另外,我认为RowDefinition没有ActualHeight属性,因此绑定可能无法评估。你需要绑定到你的控件的ActualHeight,但是在它被渲染之后才能知道该值。我想你可以使用Dispatcher.Invoke在渲染控件之后运行一些东西,弄清楚哪一个是行中最高的控件,并将所有项设置为该高度。

答案 1 :(得分:0)

您应该在XAML中执行高度绑定,而不是在代码隐藏中。

在控件上使用Horizo​​ntalAlignment =“Stretch”VerticalAlignment =“Stretch”属性。

替代方法,使用Height =“{Binding ElementName = LayoutRoot,Path = ActualHeight}来绑定maingrid的实际高度。

答案 2 :(得分:0)

<ItemsControl ItemsSource="{Binding items}">
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="{x:Type local:Class1}">
            <Grid Height="{Binding YourHeightValue}">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="1*"/>
                    <ColumnDefinition Width="1*"/>
                    <ColumnDefinition Width="1*"/>
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding prop1}"/>
                <TextBlock Grid.Column="1" Text="{Binding prop2}"/>
                <TextBlock Grid.Column="2" Text="{Binding prop3}"/>
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel IsItemsHost="True"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

答案 3 :(得分:0)

您可以使用C#代码将控件的高度(或任何属性)与其他控件的高度绑定。 这是一个例子。

Grid myGrid = new Grid();
ListBox myList = new ListBox(); //it could be any control 
private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
     myList.DataContext = this;
     myList.SetBinding(UserControl.HeightProperty,"this.myGrid.ActualHeight");
}

这对我有用。