Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式调整已加载的DataGrid列的大小_C#_Wpf_Datagrid_Column Width - Fatal编程技术网

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

C# 以编程方式调整已加载的DataGrid列的大小,c#,wpf,datagrid,column-width,C#,Wpf,Datagrid,Column Width,我有一个DataGrid,当我第一次加载数据时,它看起来像这样: 因此,它几乎完美,但当我将窗口调整到最大值时,我真正想要的是显示出来-现在列的布局如下: 我想在DataGrid视图的右边部分布置最右边的列,并让左边的列分配视图的其余部分 我的问题是:我是否可以调用DataGrid上的事件来导致列的这种布局,而这种布局只有在窗口最大化时才会发生 DataGrid XAML的简化版本如下所示: <DataGrid ItemsSource="{Binding ItemsSource,

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

因此,它几乎完美,但当我将窗口调整到最大值时,我真正想要的是显示出来-现在列的布局如下:

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

我的问题是:我是否可以调用DataGrid上的事件来导致列的这种布局,而这种布局只有在窗口最大化时才会发生

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>


我还需要检查正在运行的应用程序/控件,但我认为查看上面的XAML应该足以找到基于给定布局的解决方案。

我尝试重现您的案例,并得出结论:这取决于您如何获取项目。 如果ViewModel中的ItemsSource是一个列表,则只需为其分配一个新实例,并调用PropertyChanged事件。这将导致列的行为符合您的要求(Width=“Auto”)


代码对我来说似乎没问题。我用一些数据测试了一个类似的
DataGrid
,无论大小如何变化,它都会像你的第二张图片一样显示出来。因此,布局可能受到了其他一些影响。您是否将DataGrid托管在一个带有SizeToContent=“WidthAndHeight”或SizeToContent=“Width”的窗口中?当窗口适应内容宽度时,我经历了这种行为。窗口代码只是标准代码,如果您创建一个新的WPF项目,您将得到它——没有特殊的东西。还有一些其他的东西,比如滚动同步和行样式背景颜色定制,我可以尝试关闭它们,看看行为是否会改变,但直到现在我才认为这无关紧要。。。我将检查关闭是否会改变列宽行为…我可以验证您的发现-我还可以用ObservableCollection复制相同的想要的行为-看起来它不是集合的类型,而是一个事实,即一个现有集合实际上被一个新集合替换,之后是一个PropertyChanged事件,该事件使这项工作。ObservableCollection实际上发送NotifyCollectionChangedAction.Reset,但这似乎不足以让网格正确地布置项目。因此,现在的解决方案是在每次重新加载时始终重建整个(可观察的)集合。。。谢谢你的提示:-)
      ItemsSource = new List<Data>();
      // ItemsSource.Add(new Data()); // ..adding data 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ItemsSource)));
  public ObservableCollection<Data> ItemsSource { get; set; }
  public void AddItems()
  {
      ItemsSource.Add(new Data()); // not working
  }
    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;
            }
        }
    }