gpt4 book ai didi

c# - 奇怪的 WPF DataGrid 问题

转载 作者:行者123 更新时间:2023-11-30 17:03:34 25 4
gpt4 key购买 nike

这是我见过的最奇怪的错误!拔我的头发!

我有一个带有 DataGrid 的窗口,它绑定(bind)到一个带有自动生成列的通用 List[object]。

在内部,我们有 2 个不同的 PC 版本。在一种类型上,窗口显示(正确)如下: When it displays correctly

这是在其他 PC 构建类型上(不正确): When it displays badly

这两种类型的 PC 都是 Win 7 x64 版本,但主要区别在于显卡。在这两种情况下,我都运行完全相同的二进制文件和配置。

我的窗口的代码在这里:

<Window x:Class="FicClient.Server.ComponentWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:System="clr-namespace:System;assembly=mscorlib" Title="{Binding RelativeSource={RelativeSource AncestorType=ContentControl, AncestorLevel=1}, Path=Section}" Height="418" Width="525" Loaded="Window_Loaded" Icon="/FicClient;component/images/Visualpharm-Must-Have-Information.ico">
<DockPanel>
<DockPanel DockPanel.Dock="Top" HorizontalAlignment="Stretch" Margin="4" Background="Azure">
<TextBlock DockPanel.Dock="Left" VerticalAlignment="Center">Note: Component data is a snapshot and does not update</TextBlock>
<Button DockPanel.Dock="Right" HorizontalAlignment="Right" Click="Button_Click">
<StackPanel Orientation="Horizontal">
<Image Source="/FicClient;component/images/excel.ico" Stretch="Uniform" Height="25" />
<TextBlock VerticalAlignment="Center" Padding="5,0">Copy</TextBlock>
</StackPanel>
</Button>
</DockPanel>
<DataGrid Name="DataGridComponents" ClipboardCopyMode="IncludeHeader" ItemsSource="{Binding Mode=OneTime}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" IsReadOnly="True" >
</DataGrid>
</DockPanel>
</Window>

出于调试目的,当窗口打开时,它还会显示一个弹出窗口,告诉我列表中有多少项目,并且在这两种情况下该数字都是相同且正确的。然而,在一种 PC 类型上它只是 FUBAR。

有没有人遇到过这种问题?我还能做些什么来调试它吗?

** 更新选择的答案 **

问题确实是在安装了 4.0 和 4.5 的机器上与仅安装了 4.0 的机器上的行为似乎有所不同,即使该应用程序是针对 4.0 编译的

我的解决方案是手动生成列。我所做的是将事件处理程序绑定(bind)到 DataGrid 上的 DataContextChanged,然后在处理程序中执行此操作:

private void DataGridComponents_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
var dataGrid = sender as DataGrid;
if (dataGrid == null) return;
var rows = dataGrid.DataContext as List<object>;
if (rows == null) return;
if (rows.Count == 0) return;
var first = rows[0];
foreach (var property in first.GetType().GetProperties())
{
var column = new DataGridTextColumn
{
Header = property.Name,
Binding = new Binding(property.Name)
};
column.Binding.StringFormat = "{0:0.00}";
dataGrid.Columns.Add(column);
}
}

最佳答案

我认为这是行为发生的变化,因为在一台机器上安装了 .NET 4.5 而在另一台机器上安装了 .NET 4.0

WPF DataGrid 的行为似乎有点不同。在 .NET 4 中,DataGrid 在绑定(bind)到匿名类型时存在一些问题。

解决方案:

  • 在所有计算机上使用 .net 4.5
  • 手动定义 DataGrid 列并将 AutogenerateColumns 设置为 false
  • 使用普通类而不是匿名类型

替换

select new { Symbol = "XXX",  Quantity = 6000, ... };

select new Stock { Symbol = "XXX",  Quantity = 6000, ... };

关于c# - 奇怪的 WPF DataGrid 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18457697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com