Изменить размер столбца DataGrid OnLoaded программно - PullRequest
2 голосов
/ 18 марта 2019

У меня есть эта DataGrid, которая выглядит так, когда я загружаю данные в первый раз: enter image description here

так, почти идеально, но то, что я действительно хочу, показано, когда я изменяю размерОкно на максимум - столбцы теперь расположены так: enter image description here

Я хотел бы расположить большинство правых столбцов в правой части представления DataGrid и иметь левый столбецвыделите оставшуюся часть представления.

Мой вопрос таков: можно ли вызвать событие в DataGrid, чтобы вызвать такое расположение столбцов, которое в противном случае происходило бы только при максимизации окна? *

упрощенная версия XAML DataGrid выглядит следующим образом:

<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>

У меня также есть работающее приложение / элемент управления для проверки здесь , но я думаю, что достаточно посмотреть на вышеупомянутый XAML, чтобы найти решениена основе данного макета.

1 Ответ

1 голос
/ 22 марта 2019

Я попытался воспроизвести ваш случай и пришел к результату: это зависит от того, как вы будете использовать ItemsSource. В случае, если ItemsSource в ViewModel является списком, вы можете просто назначить ему новый экземпляр и вызвать событие PropertyChanged. Это приведет к тому, что столбцы будут вести себя так, как вы хотите (Width = "Auto").

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

Однако, поскольку в настоящее время он не работает, я полагаю, что у вас есть ObservableCollection в качестве ItemsSource, и вы добавляете элементы там. В моих тестах, он ведет себя так, как вы описали, столбцы остаются маленькими, если только размер окна не изменен вручную.

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

Единственный способ заставить сетку сделать это - это сбросить ширину столбца с Auto до некоторого значения, а затем обратно. Для этого используется кнопка. но Any 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;
            }
        }
    }
...