【发布时间】:2023-03-20 21:04:01
【问题描述】:
我试图弄清楚为什么我在 WPF 中创建的数据网格中的最后一列在添加记录后没有适当地调整大小。相反,模板列中只有一个按钮是部分可见的。由于该列设置为自动宽度,我希望这会调整第一列(星形列)的大小以适合窗口中最后一列的内容。
谁能告诉我这里哪里出错了?附带说明一下,如果我之后调整窗口(而不是列)的大小,该列现在会显示所有模板列内容。
如果这正是 WPF 的工作方式,有没有办法让列重新计算为添加第一行后设置的自动/星号值?
这是一个简化示例中的问题的再现,所以不,这当然不是我的实际代码,我通常不会在后面的代码中编码。
后面的代码:
public partial class MainWindow : Window
{
ObservableCollection<Test> TestCollection;
public ICollectionView GridView { get; set;}
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
TestCollection = new ObservableCollection<Test>();
GridView = CollectionViewSource.GetDefaultView(TestCollection);
}
private void TestButton_Click(object sender, RoutedEventArgs e)
{
TestCollection.Add(new Test { Field1 = "Test", Field2 = "Test", Field3 = "Test", Field4 = "Test" });
GridView.Refresh();
}
}
public class Test
{
public string Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }
public string Field4 { get; set; }
}
}
XAML:
<Window x:Class="WpfApp4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp4"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="400">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button Grid.Row="0" x:Name="TestButton" Click="TestButton_Click"/>
<DataGrid Grid.Row="1" ItemsSource="{Binding GridView}" AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Field1" Width="*" Binding="{Binding Field1}"/>
<DataGridTextColumn Header="Field2" Width="Auto" Binding="{Binding Field1}"/>
<DataGridTextColumn Header="Field3" Width="Auto" Binding="{Binding Field1}"/>
<DataGridTextColumn Header="Field4" Width="Auto" Binding="{Binding Field1}"/>
<DataGridTemplateColumn Header="Options">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Content="Test Button"/>
<Button Grid.Column="1" Content="Test Button 2"/>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Content="Test Button"/>
<Button Grid.Column="1" Content="Test Button 2"/>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
【问题讨论】:
-
您没有做错任何事情,只是该列是空的,因此自动宽度与列标题的宽度一致。您可以在此视图后面添加代码: [NameOfYourDataGrid].Columns[4].Width=CurrentWidthJustFixed; [NameOfYourDataGrid].Columns[4].Width=GridLength.Auto;集合更改后。
-
像这样将宽度设置为 *:
Width="*"