当WPF DataGrid的所有单元格(行)为空时,为其设置最小列宽

时间:2018-04-13 08:29:09

标签: c# wpf datagrid .net-3.5 wpftoolkit

我有一个WPF数据网格,它有一些列。有时,根据具体情况,填充时会有一些列没有内容(整列对所有行都是空的)。

<Window x:Name="MyWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit"> 

<Grid x:Name="outerGrid" HorizontalAlignment="Stretch">
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
        <RowDefinition Height="auto"></RowDefinition>
    </Grid.RowDefinitions>

<my:DataGrid  Grid.Row="1" Name="MyDataGrid"                         
              AutoGenerateColumns="False" 
              ItemsSource="{Binding Path=MyListOfItems}" 
              SelectedItem="{Binding Path=MySelectedItem}" 
              VerticalAlignment="Stretch" IsReadOnly="True" 
              SelectionMode="Single" ColumnWidth="*" 
              SelectionChanged="dgEfectes_SelectionChanged"
              Width="{Binding Path=ActualWidth, ElementName=outerGrid}">

</my:DataGrid>

</Grid>
</Window>

请注意,DataGrid的宽度与Grid周围的宽度相同。

因此,对于这些空的列(没有内容),我想调整它们以使其具有最小宽度(例如,它的最小默认宽度或我指定的宽度),那么我可以按顺序利用它使其余列更宽,避免水平滚动。

1 个答案:

答案 0 :(得分:0)

网格的内容(大多数)工作方式是填充所有可用空间 除非你在某个地方有一些额外的样式或代码而你没有向我们展示,否则你不需要这些标记:

Width="{Binding Path=ActualWidth, ElementName=outerGrid}"

你没有向我们显示任何列,你设置autogenerate false,所以这看起来有点奇怪 此外,Datagrid在wpf网络框架中,所以我不遵循为什么你有我的:在它之前,除非这个数据网格以某种方式从datagrid继承。

从表面上看,你问题的答案似乎很简单 datagrid列具有MinWidth属性,您可以设置它 https://msdn.microsoft.com/en-us/library/system.windows.controls.datagridtextcolumn_properties(v=vs.110).aspx

事实证明,有一些更复杂的标准。

假设您有一个窗口的viewmodel,并且datagrid的itemssource绑定到该属性。添加另一个属性。您可以将其设为double并将列宽绑定到该值,或使用bool和datatrigger设置宽度。无论哪种方式。使用一些linq迭代您的集合并检查所有值是否都不为空。在此基础上设置属性 您可以使用trueforall https://msdn.microsoft.com/en-us/library/kdxe4x4w(v=vs.110).aspx