这是我见过的最奇怪的错误!拉出我的头发!
我有一个带有DataGrid的Window,它绑定到带有自动生成列的通用List [object]。
在内部我们有2个不同的PC构建。在一种类型上,窗口显示(正确)如下:
这是另一种PC构建类型(不正确):
两种类型的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);
}
}
答案 0 :(得分:2)
我认为这是行为的变化,因为在一台机器上安装了.NET 4.5,而在另一台.NET 4.0上
WPF DataGrid的行为似乎有点不同。 在.NET 4中,DataGrid在绑定到匿名类型时存在一些问题。
解决方案:
替换
select new { Symbol = "XXX", Quantity = 6000, ... };
与
select new Stock { Symbol = "XXX", Quantity = 6000, ... };