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

Dav*_*ave 4 c# wpf datagrid .net-4.0 wpfdatagrid

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

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

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

它只是一个三列DataGrid,每列显示TextBlocks.任何人都可以解释为什么这种滚动模式有问题吗?这是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>
Run Code Online (Sandbox Code Playgroud)

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

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

public struct MainLogData
{
    public string Timestamp { get; set; }
    public string Level { get; set; }
    public string Message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

JFT*_*TxJ 6

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

你的问题是你正在使用"结构".解决问题的简单方法是使结构成为一个:

public class MainLogData 
{ 
    public string Timestamp { get; set; } 
    public string Level { get; set; } 
    public string Message { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

只需将结构单词更改为类就可以解决您的问题.

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

总而言之,DataGrid在确定您选择哪个项目(或使用箭头键移动)时​​遇到问题,因为列表中的许多对象被视为"相同"或"相等".这就是它混淆的原因.诚然,我认为这是一个DataGrid的bug(或至少陌生人的行为,如果它是由设计),但是从结构改变你的数据类型,一类可以帮助你回到正轨!

干杯