DataGrid的列宽(width="*")未能“刷新”。

3
我有以下代码,其中包含一个DataGrid,它列出了与ListBox中选定项目对应的项目。一切运行良好,但是DataGrid列的宽度表现出奇怪的问题。我将“name”列的宽度设置为star,以便“wert”列占用其内容所需的空间,而“name”列占用其余部分。这起作用了,但有点问题。当应用程序启动时,所有列都处于最小宽度状态,只有在ListBox中选择另一个项目时,列的宽度才会更新为所需的值(“name”的星号,“wert”的自动)。 我尝试在应用程序加载时使用datagrid的UpdateLayout方法,但没有帮助。
此外,我正在使用一个expander,当所有expander关闭时,我必须先展开其中一个项目,然后再加载listbox中的另一个项目,才能使宽度正确。
请问可以指导我正确的方向吗? :)
更新:初始问题已解决,但还有另一个小问题: 列不再折叠,但它们也没有达到所需的大小。它们的大小适合其标题名称,而不是行内容。仅当默认情况下关闭expander时才会发生这种情况。当我将expander设置为展开时,所有列都将设置为其所需的内容宽度。
以下是使用的代码:
<Grid.DataContext>
            <XmlDataProvider x:Name="XmlData" Source="entries.xml" XPath="Root/Person" />
</Grid.DataContext>

<ListBox Name="PersonListBox"
                ItemsSource="{Binding}"
                ItemTemplate="{StaticResource listBoxTemplate}"
                IsSynchronizedWithCurrentItem="True"
                Visibility="Visible" SelectionMode="Single"  SelectedIndex="-1" DataContext="{Binding}">
            </ListBox>

<DataGrid IsSynchronizedWithCurrentItem="True" Name="itemGrid"
                 DataContext="{Binding ElementName=PersonListBox, Path=SelectedItem}" 
                 CanUserResizeColumns="False"
                 CanUserResizeRows="False"
                 IsReadOnly="true"
                 Background="White"
                 HorizontalScrollBarVisibility="Hidden"
                 AutoGenerateColumns="False">
                <DataGrid.Resources>
                    <CollectionViewSource x:Key="items" Source="{Binding XPath=item}">
                        <CollectionViewSource.GroupDescriptions>
                            <PropertyGroupDescription PropertyName="@name"/> 
                        </CollectionViewSource.GroupDescriptions>
                    </CollectionViewSource>
                </DataGrid.Resources>
                <DataGrid.ItemsSource>
                    <Binding Source="{StaticResource items}"/>
                </DataGrid.ItemsSource>
                <DataGrid.Columns>
                    <DataGridTextColumn Width="*" Header="Name" Binding="{Binding XPath=@name}"/>
                    <DataGridTextColumn Header="Wert" Binding="{Binding XPath=@value, Converter={StaticResource sumConverter}}}"/>
                </DataGrid.Columns>
                <DataGrid.GroupStyle>
                   <GroupStyle>
                    <GroupStyle.ContainerStyle>
                        <Style TargetType="{x:Type GroupItem}">
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="{x:Type GroupItem}">
                                        <Expander >
                                            <Expander.Header>
                                                <StackPanel Orientation="Horizontal">
                                                    <TextBlock Text="{Binding Path=Name}" />
                                                    <TextBlock Text="{Binding Path=Items, Converter={StaticResource sumConverter}}" />
                                                </StackPanel>
                                            </Expander.Header>
                                            <ItemsPresenter />
                                        </Expander>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </GroupStyle.ContainerStyle>
                </GroupStyle>
                </DataGrid.GroupStyle>
            </DataGrid>
1个回答

14
我发现了这篇帖子,它给了我答案。简而言之,默认的GroupStyle.Panel(StackPanel)不能适应DataGrid的宽度"*",所以列会折叠。只需添加即可。
<GroupStyle.Panel>
    <ItemsPanelTemplate>
        <DataGridRowsPresenter/>
    </ItemsPanelTemplate>               
</GroupStyle.Panel>

将此代码添加到你的GroupStyle中,你就可以了。


你尝试将列的宽度设置为“自动”而不是“*”了吗? - philt5252
好的,我想到的最佳解决方案是这样的:您可以为每个列取消单独的“Column.Width”,并将“DataGrid.ColumnWidth”设置为“*”、“SizeToCells”、“SizeToHeader”或“Auto”。因为您将“IsExpanded”设置为“false”,所以在展开它们之前,列不会知道内容的大小。也许最初将它们展开,然后在加载时关闭它们? - philt5252
谢谢你迄今为止的帮助,但我不喜欢它们最初被打开。我想我会向扩展器添加一个“展开”事件,然后检查当前CollectionViewGroup分组的最大宽度,并将列设置为该宽度。该组应通过扩展器的DataContext访问。我希望这样能行,因为这意味着我开始理解它了^^。感谢您的帮助,非常感激 :) - ch40s
我找不到一种好的方法来测量字符串的宽度……所以我尝试像在XAML中展开Expander时一样将列宽设置为星形(自动)。这个方法是有效的,但不是立即生效的:第一次展开时什么也不会发生,然后当我第二次展开时,列就会正确地调整大小。肯定有一种简单的方法可以做到这一点吧?我的数据按展开器分组,我希望列适应该数据的内容(除了第一行,它应该是星形宽度)。Grid还没有“看到”数据,但当展开事件被触发时,为什么重新设置列宽度就不起作用呢? - ch40s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接