我遇到了一件很奇怪的事情。我的WPF程序中有一个DataGrid。 DataGrid的总体设置如下:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!--DataGrid element-->
<DataGrid
Grid.Row="0"
x:Name="LoadDataGrid"
ItemsSource="{Binding DataGridSource, UpdateSourceTrigger=PropertyChanged}"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserSortColumns="False"
CanUserDeleteRows="False"
CanUserReorderColumns="False"
GridLinesVisibility="All"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Visible"
HorizontalAlignment="Center"
RowHeaderWidth="0"
BorderBrush="Black"
BorderThickness="1"
Background="{StaticResource CustomPureWhiteBrush}"
SelectedIndex="{Binding CurrentRowIndex, Mode=TwoWay}">
<DataGrid.Columns>
...
</DataGrid.Columns>
</DataGrid>
ViewModels中的相关代码为:
/// <summary>
/// Load DataGridSource automatically if data file is saved in the same directory with the dwg drawing.
/// If it doesn't exist, all a new empty item to DataGridSource
/// </summary>
protected override void DataGridSourceLoaded()
{
// Check if the data file exists
bool IsDataSourceExists = HX_FileOperations.IsFileExistsInCurrentDirectory("低压配电回路设计.HX");
// If it doesn't exist, add an initial member to DataGridSource
if (!IsDataSourceExists)
{
// Add a new item to the GridDataSource
DataGridSource.Add(new LoadItemViewModel()
{
Id = DataGridSource.Count + 1,
});
}
// If it exists, then read data to DataGridSource
else
{
DataGridSource.Clear();
List<Loads> loadsList = FileOperation.ReadBinaryDataFromCurrentDirectory("低压配电回路设计.HX") as List<Loads>;
for (int i = 0; i < loadsList.Count; i++)
{
DataGridSource.Add(new LoadItemViewModel()
{
Id = i + 1,
TransformerNumber = loadsList[i].TransformerNumber,
ELVCabinetNumber = loadsList[i].ELVCabinetNumber,
CircuitNumber = loadsList[i].CircuitNumber,
UnitType = loadsList[i].UnitType,
SeperationHeight = loadsList[i].SeperationHeight,
EquiptmentNumber = loadsList[i].EquiptmentNumber,
EquiptmentFunction = loadsList[i].EquiptmentFunction,
LoadsType = loadsList[i].LoadsType,
LoadLevel = loadsList[i].LoadsLevel,
ApplicationRange = loadsList[i].ApplicationRange,
DieselConnection = loadsList[i].DieselConnection,
EquiptPowerP = loadsList[i].EquiptPowerP,
EquiptPowerX = loadsList[i].EquiptPowerX,
SimultaneousRatioP = loadsList[i].SimultaneousRatioP,
SimultaneousRatioX = loadsList[i].SimultaneousRatioX,
PowerRatioP = loadsList[i].PowerRatioP,
PowerRatioX = loadsList[i].PowerRatioX,
TanP = loadsList[i].TanP,
TanX = loadsList[i].TanX,
PcP = loadsList[i].PcP,
PcX = loadsList[i].PcX,
QcP = loadsList[i].QcP,
QcX = loadsList[i].QcX,
ScP = loadsList[i].ScP,
ScX = loadsList[i].ScX,
IcP = loadsList[i].IcP,
IcX = loadsList[i].IcX,
});
}
}
}
当显示少于10个数据项时,DataGrid的宽度与Grid一样大。但是,当显示更多数据项时,DataGrid的宽度仅为Grid宽度的五分之一。所有列甚至比其内容还窄。 如下图所示: The DataGrid displays incorrectly
我已经测试了很多可能性。而且我发现,无论DataGrid显示多少项目。它从一个非常薄的表开始,然后(也许等待所有数据被加载)变得和它的容器一样宽。而且,当数据项更多时,加载需要一段时间,而且我认为这会阻止DataGrid适应其容器。
我试图手动将窗口缩放到很小的窗口(仅覆盖DataGrid的很多区域),然后最大化窗口,DataGrid却显示为Correct,如下所示: Correctly showing all data
那么,是因为加载数据了吗?如果是,该如何解决?我已经尝试将加载数据放入OnLoad事件中,以便可以首先初始化所有组件,但是这样做并不幸运。