2011-12-27 10 views
0

GridViewのような独自の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); 
+1

コントロールの「VerticalAlignment」を「Stretch」に設定して、使用可能なスペースをすべて埋めるようにしてください。また、 'RowDefinition'が' ActualHeight'プロパティを持っているとは思いません。バインディングに対してはおそらく何も評価されていません。あなたのコントロールの 'ActualHeight'にバインドする必要がありますが、その値はレンダリングされるまで知ることができません。コントロールがレンダリングされた後、 'Dispatcher.Invoke'を使って何かを実行し、行の中で最も背の高いコントロールを見つけ出し、すべてのアイテムをその高さに設定することができます。 – Rachel

+0

ありがとうございました。今度は、グリッドがレンダリングされただけでコントロールの高さをバインドしています。すべてが完璧に機能します。 –

+0

嬉しいこと:)私は答えとして投稿しました – Rachel

答えて

1

は、あなたのコントロールのVerticalAlignmentStretchへを設定してみてくださいすべての利用可能なスペース。

また、私はRowDefinitionActualHeight性質を持っているとは思わないので、結合はおそらく、何にも評価されています。あなたはしかし、その値が知っているされていない、あなたのコントロールのActualHeightにバインドする必要があると思いますそれがレンダリングされるまで、私はDispatcher.Invokeを使用して、コントロールがレンダリングされた後で何かを実行し、行の中で最も高いコントロールがどれかを特定し、すべてのアイテムをその高さに設定することができます。

0

あなたはXAMLではなく、分離コードで結合身長を行う必要があります。

コントロールでHorizo​​ntalAlignment = "Stretch" VerticalAlignment = "Stretch"プロパティを使用します。それがいっぱいに拡張されて

あなたmaingridの実際の高さと結合する代わりに、使用高さ= "{のElementName = LayoutRootバインディング、パス= ActualHeight}。

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

これは私に役立ちました。

関連する問題