以编程方式调整已加载的DataGrid列的大小

时间:2019-03-18 17:22:07

标签: c# wpf datagrid column-width

我有这个DataGrid,当我第一次加载数据时它看起来像这样: enter image description here

因此,它几乎是完美的,但是当我将Window调整为最大尺寸时,我真正想要的是显示-现在列的布局如下: enter image description here

我想在DataGrid视图的右侧布置最右边的列,并让左列分配视图的其余部分。

我的问题是:我可以在DataGrid上调用一个事件以引起列的这种布局,否则只有在Window最大化时才会发生这种布局吗?

DataGrid的XAML的简化版本如下所示:

<DataGrid
   ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource TemplatedParent}}"
   HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
   ScrollViewer.HorizontalScrollBarVisibility="Hidden" 
   ScrollViewer.VerticalScrollBarVisibility="Auto" 
   ScrollViewer.CanContentScroll="True"
   AutoGenerateColumns="False"
   GridLinesVisibility="None"
   ColumnWidth="*">
   <DataGrid.Columns>
       <DataGridTemplateColumn Width="*" Header="Name">
           <DataGridTemplateColumn.CellTemplate>
               <DataTemplate>
                   <Grid>
                       <Grid.ColumnDefinitions>
                           <ColumnDefinition Width="Auto"/>
                           <ColumnDefinition Width="*"/>
                       </Grid.ColumnDefinitions>

                       <TextBlock Grid.Column="1"
                                  Text="{Binding ItemName}"
                                  ToolTipService.ShowOnDisabled="true"
                                  >
                        </TextBlock>
                   </Grid>
               </DataTemplate>
           </DataGridTemplateColumn.CellTemplate>
       </DataGridTemplateColumn>
       <DataGridTemplateColumn Width="Auto" Header="Size">
           <DataGridTemplateColumn.CellTemplate>
               <DataTemplate>
                   <TextBlock
                       Text="{Binding ItemLengthA}"
                              HorizontalAlignment="Right"
                              Margin="3,0,0,0"
                   />
               </DataTemplate>
           </DataGridTemplateColumn.CellTemplate>
       </DataGridTemplateColumn>
       <DataGridTemplateColumn Width="Auto" Header="Modified">
           <DataGridTemplateColumn.CellTemplate>
               <DataTemplate>
                   <TextBlock
                       Text="{Binding ItemLastUpdateA}"
                       HorizontalAlignment="Right"
                       Margin="3,0,0,0"
                   />
               </DataTemplate>
           </DataGridTemplateColumn.CellTemplate>
       </DataGridTemplateColumn>
   </DataGrid.Columns>
</DataGrid>

我还可以使用应用程序/控件来检查here,但我认为查看上述XAML应该足以找到基于给定布局的解决方案。

1 个答案:

答案 0 :(得分:1)

我试图重现您的情况并得出结果:这取决于您如何处理ItemsSource。 如果ViewModel中的ItemsSource是一个List,则只需为其分配一个新实例,然后调用PropertyChanged事件。这将导致列的行为像您想要的那样(Width =“ Auto”)。

      ItemsSource = new List<Data>();
      // ItemsSource.Add(new Data()); // ..adding data 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ItemsSource)));

但是,由于它当前不起作用,我想您可能有一个ObservableCollection作为ItemsSource,并且您正在其中添加Items。在我的测试中,除非您手动调整Window的大小或手动调整列的大小,否则列会保持较小的行为。

  public ObservableCollection<Data> ItemsSource { get; set; }
  public void AddItems()
  {
      ItemsSource.Add(new Data()); // not working
  }

我发现迫使网格执行此操作的唯一方法是,将“列宽”从“自动”取消设置为某个值,然后返回。用于执行此操作的按钮。但任何Onload也可以工作

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        foreach (DataGridTemplateColumn item in MyDataGrid.Columns)
        {
            if (item.Width.IsAuto)
            {
                item.Width = new DataGridLength(item.ActualWidth, item.Width.UnitType);
                item.Width = DataGridLength.Auto;
            }
        }
    }