Slime recipe
Slime recipe

Reputation: 2263

Binding Height from code behind

I have a custom GridView like control made of a Grid panel with several controls in each row (All of them from System.Windows.Controls).

The user requested that the row Height will grow unrestricted with the control's content. I'm having a problem to maintain the size of all the controls in each row with relation to the highest one.

I'm trying to one-way bind the Height of all the controls in each row to the RowDefenition ActualHeight property. but it is not working as I expect it to work (Each control keeps it's own size to the minimum)

Any help will be appreciated, thanks.

Here is the code where I'm trying to bind:

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

Upvotes: 0

Views: 3251

Answers (4)

Dilshod
Dilshod

Reputation: 3311

You can bind your control's height(or any property) with other control's height with C# code. Here is the example.

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

this worked for me.

Upvotes: 0

Rachel
Rachel

Reputation: 132548

Try setting your Control's VerticalAlignment to Stretch, so it expands to fill all available space.

Also, I don't think RowDefinition has an ActualHeight property, so the binding is probably evaluating to nothing. You'd need to bind to the ActualHeight of your control, however that value isn't know until after it's been Rendered. I suppose you could use Dispatcher.Invoke to run something after the controls have been rendered, figure out which is the tallest control in the row, and set all item to be that height.

Upvotes: 1

snurre
snurre

Reputation: 3105

<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>

Upvotes: 0

De ruige
De ruige

Reputation: 347

You should do the Height binding in XAML, not in codebehind.

Use the HorizontalAlignment="Stretch" VerticalAlignment="Stretch" property on your control.

Alternative, use Height="{Binding ElementName=LayoutRoot, Path=ActualHeight} to bind with the actual height of your maingrid.

Upvotes: 0

Related Questions