奇怪的WPF DataGrid问题

时间:2013-08-27 05:33:44

标签: c# wpf datagrid

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

我有一个带有DataGrid的Window,它绑定到带有自动生成列的通用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&amp;机器上的行为似乎有所不同。 4.5安装vs仅4.0,即使应用程序是针对4.0编译的

我的解决方案是手动生成列。我所做的是将事件处理程序绑定到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);
    } 
}

1 个答案:

答案 0 :(得分:2)

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

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

解决方案:

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

替换

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

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