【发布时间】:2015-04-25 03:22:53
【问题描述】:
每个 DataGrid 的高度应该取决于:
- 是否扩展了其他扩展器
- DataGrid 有多少行
- 如果扩展了其他 Extender,其他 DataGrid 有多少行。
- 扩展器所在的 StackPanel 的高度
所有扩展程序都应该始终可见。
如果例如只打开最上面的 Extender 并且它的 DataGrid 有 100 行 DataGrid 的高度应该几乎是 StackPanel 的高度,但在底部其他两个 Extender 应该是可见的并且最上面的 DataGrid 是可滚动的。
当打开 2 或 3 个扩展器时,如果 DataGrids 中有足够的数据,则 StackPanel 应该是“满的”。
我尝试绑定高度属性(用于最下方的扩展器对象信息)
<Expander Header="Object information" IsExpanded="{Binding ObjectInformationExpanded}">
<DataGrid Name="ObjectInformationGrid" CanUserAddRows="False" CanUserResizeColumns="True" CanUserSortColumns="True" IsReadOnly="True"
ItemsSource="{Binding SelectedObjectAttributes}" AutoGenerateColumns="False"
Height="{Binding ObjectInformationHeight, Mode=TwoWay}"
ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Visible">
<DataGrid.Columns>
<DataGridTextColumn Header="Field" Binding="{Binding Item1}" />
<DataGridTextColumn Header="Value" Binding="{Binding Item2}" />
</DataGrid.Columns>
</DataGrid>
</Expander>
但是现在我的 ViewModel 有很多与演示(视图)相关的代码,并且仍然没有将 StackPanel 的高度纳入计算。相反,我设置了硬编码的双精度值,这不是很好的解决方案。
下面是一些简单的代码,当扩展器打开/关闭并且 DataGrid 绑定集合发生更改时更新绑定高度属性(此处仅适用于最上面的 DataGrid):
private void UpdateHeights()
{
if (SelectedObjectsExpanded == true)
{
if (_selectedObjects.Count == 0)
{
SelectedObjectsHeight = double.NaN;
}
else if (_selectedObjects.Count < 8)
{
SelectedObjectsHeight = 100;
}
else
{
if (ObjectInformationExpanded && SelectedSwitchesExpanded)
SelectedObjectsHeight = 100;
else
SelectedObjectsHeight = 200;
}
}
//...
谢谢!
【问题讨论】:
标签: wpf mvvm data-binding datagrid