代码后面的绑定高度
本文关键字:绑定 高度 代码 | 更新日期: 2023-09-27 18:18:55
我有一个自定义的GridView控件,由网格面板组成,每一行有几个控件(它们都来自System.Windows.Controls)。
用户要求行高度随控件的内容无限制地增长。我在维持每行中所有控件的大小与最高控件的关系时遇到了问题。
我试图将每一行中所有控件的高度单向绑定到rowdefentionactualheight属性。但它不工作,因为我期望它的工作(每个控件保持它自己的大小到最小)
任何帮助将不胜感激,谢谢。
这是我试图绑定的代码:
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);
尝试将控件的VerticalAlignment
设置为Stretch
,以便它扩展以填充所有可用空间。
另外,我不认为RowDefinition
具有ActualHeight
属性,因此绑定可能评估为零。您需要绑定到控件的ActualHeight
,但是该值直到渲染后才知道。我想你可以使用Dispatcher.Invoke
在控件渲染后运行一些东西,找出哪一个是行中最高的控件,并将所有项目设置为该高度。
应该在XAML中进行高度绑定,而不是在后台代码中。
在控件上使用horizontalalign ="Stretch" vertical align ="Stretch"属性。
可选,使用Height="{Binding ElementName=LayoutRoot, Path=ActualHeight}来绑定maingrid的实际高度。
<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>
你可以用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");
}