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