使用向下箭头键滚动的WPF DataGrid行为很奇怪

时间:2012-06-19 15:57:47

标签: c# wpf .net-4.0 datagrid wpfdatagrid

我有一段时间以来一直使用的WPF DataGrid,效果很好。与其他海报不同,我还没有滚动条或鼠标滚轮的问题。我将 CTRL END 编程为转到DataGrid的末尾,然后跟踪最近添加的项目。我可以使用 up 键向上滚动DataGrid内容。

但是,我对 down 键的行为非常奇怪!如果我从DataGrid的顶部开始并按住 down 键,它会滚动一点,然后最终在两个相邻行之间来回反弹。如果我 pgdn ,它将向下滚动更多,然后跳回到它之间跳过的前两行的最顶部,然后向下滚动到我 pgdn 的点去。如果我再向下翻页, down 键将滚动到结尾。如果我转到DataGrid的顶部并重新开始,我会一遍又一遍地得到完全相同的行为。

我还没有找到解决这个问题的帖子,我在DataGrid文档中没有看到任何有用的内容。

这只是一个三列DataGrid,其中每列显示TextBlock个。任何人都可以解释为什么这种滚动模式有问题吗?这是XAML:

<DataGrid ItemsSource="{Binding MainLog}" AutoGenerateColumns="False" 
     Name="log_datagrid" SelectedCellsChanged="log_datagrid_SelectedCellsChanged"   
     KeyUp="datagrid_KeyUp" LoadingRow="log_datagrid_LoadingRow">
    <DataGrid.Columns>
        <!-- timestamp -->
        <DataGridTemplateColumn Header="Timestamp">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Timestamp}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <!-- level -->
        <DataGridTemplateColumn Header="Level">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Level}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <!-- error message -->
        <DataGridTemplateColumn Header="Message">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Message}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

顺便说一句,即使我的所有代码隐藏事件处理程序都已注释掉,也会出现这种情况。

以下是我的MainLog集合包含的结构的定义:

public struct MainLogData
{
    public string Timestamp { get; set; }
    public string Level { get; set; }
    public string Message { get; set; }
}

1 个答案:

答案 0 :(得分:6)

好的...我用字符串复制了行为(绑定到数据网格的简单字符串列表)。当我在列表中引入重复字符串时,行为就开始发生了。似乎数据网格在“选定索引”和“选定值”之间混淆。 当我尝试选择另一个可见行上存在的值(在我的测试中的一个字符串)时会发生同样的事情:选择被搞砸了:一半时间,没有选择正确的行。

您的问题是您正在使用“结构”。解决问题的简单方法是将结构设为

public class MainLogData 
{ 
    public string Timestamp { get; set; } 
    public string Level { get; set; } 
    public string Message { get; set; } 
}

只需将结构字词更改为即可解决您的问题。

你必须明白结构和类是不一样的,并且结构根据它们中的值确定它们与另一个变量(具有相同类型)的“相等”(特定的2个变量)包含相同数据的结构类型将被视为相等)。在的情况下,除非另有说明,否则相等性由其内存地址决定;这确保了默认情况下,对象的2个实例,即使它们包含相同的数据,也不会被认为是相等的,因为它们不驻留在相同的内存地址(这种行为可以通过覆盖“GetHashCode”和“Equals”方法来覆盖在任何类定义中。)

总而言之,DataGrid在确定您选择的项目(或使用箭头键移动)时​​遇到问题,因为列表中的许多对象被视为“相同”或“相等”。这就是它混淆的原因。不可否认,我认为这是一个datagrid错误(或者至少是陌生的行为,如果它是设计的),但是将数据类型从结构改为类应该可以帮助你重回正轨!

干杯