2011-12-27 7 views
0

У меня есть настраиваемый GridView как элемент управления из панели Grid с несколькими элементами управления в каждой строке (все они из System.Windows.Controls).Binding Height from code

Пользователь запросил, чтобы высота строки неограниченно увеличивалась с содержимым элемента управления. У меня проблема с сохранением размера всех элементов управления в каждой строке по отношению к самой высокой.

Я пытаюсь в одностороннем порядке связать высоту всех элементов управления в каждой строке с свойством 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); 
+1

Попробуйте установить 'VerticalAlignment' вашего элемента управления' 'Stretch', поэтому он расширяется, чтобы заполнить все свободное пространство. Кроме того, я не думаю, что у 'RowDefinition' есть свойство ActualHeight', что привязка, вероятно, не оценивает ничего. Вам нужно привязать к «ActualHeight» вашего контроля, но это значение не известно, пока оно не будет показано. Я полагаю, вы могли бы использовать 'Dispatcher.Invoke' для запуска чего-то после визуализации элементов управления, выяснить, какой из них является самым высоким элементом в строке, и установить для всех элементов эту высоту. – Rachel

+0

Большое спасибо, поэтому теперь я привязываю высоту элементов управления только после того, как сетка была обработана, и все работает отлично. –

+0

Рад, что сработал :) Я отправил его в качестве ответа, чтобы вы могли принять – Rachel

ответ

1

Попробуйте установить элемента управления VerticalAlignment к Stretch, поэтому она расширяется, чтобы заполнить все доступное пространство.

Кроме того, я не думаю, что RowDefinition имеет ActualHeight свойство, поэтому связывание, вероятно, вычисляемое ничего. Вы должны были бы связываться с ActualHeight вашего контроля, однако это значение не знает до тех пор, пока он не будет показан. вы можете использовать Dispatcher.Invoke, чтобы запустить что-то после визуализации элементов управления, выяснить, какой из них является самым высоким элементом в строке, и установить для всех элементов эту высоту.

0

Вы должны сделать Высоту привязки в XAML, а не в коде.

Используйте свойство HorizontalAlignment = "Stretch" VerticalAlignment = "Stretch" на вашем элементе управления.

Альтернатива, использование Height = "{Binding ElementName = LayoutRoot, Path = ActualHeight}, чтобы связать с фактической высоты вашего maingrid.

+1

Привет, De ruige, я не думаю, что могу использовать XAML, поскольку сетка генерируется во время выполнения. есть ли способ сделать это из кода? –

+1

@Esh: Могу я спросить, почему ваша сетка генерируется во время выполнения? –

+0

Не является ли StackPanel лучше, если вы хотите добавить элементы? – snurre

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

И это отвечает OP ... Как? –

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

Это сработало для меня.