数行のグリッドがあります。一番上の行には、コレクションに動的にバインドされ、DataTemplateSelectorとItemsPanelTemplate(水平に配置された単一のWrapPanelを使用)を使用するItemsControlがあります。これが私がこれまでに持っているものの簡略版です:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition Height="2" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<GridSplitter Background="#666" Grid.Row="1" Height="Auto" Width="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
<ItemsControl x:Name="items" Background="#DDD" Grid.Row="0" ItemTemplateSelector="{StaticResource itemTemplateSelector}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Grid>
最初の行の高さを40に設定する代わりに、ItemsControlがそのすべてのコンテンツに適合するために必要な最小の高さに基づいて動的に設定したいと思います。ItemsControlの高さは、グリッド行の高さによって制約されているため、どの要素にバインドする必要があり、どの要素のプロパティにバインドする必要があるのかがわかりません。
グリッド行の高さをItemsControlの「目的の高さ」にバインドすることは理にかなっています。そこで、DesiredSizeプロパティを見つけて、RowDefinitionのHeightをItemsControlのDesiredSize.Heightにバインドしました。これは最初にロードされたときに機能しますが、コントロールのサイズを変更しても更新されません(ItemsPanelTemplateとしてWrapPanelを使用しているため、ウィンドウのサイズを変更すると、ItemsControlの高さが変更されます)。
この種の状況がバインディングフレームワークによってサポートされているかどうかを誰かが知っていますか、またはこれを達成するためにイベントハンドラーコードを追加する必要がありますか?
ありがとう。