4

我有一个使用了一段时间的 WPF DataGrid,它工作得很好。与这里的其他海报不同,我还没有遇到滚动条或鼠标滚轮的问题。我已经CTRLEND编程到 DataGrid 的末尾,然后它会跟踪最近添加的项目。我可以用 键向上滚动浏览DataGrid内容up

但是,我对down钥匙的行为真的很奇怪!如果我从顶部开始DataGrid并按住down键,它会滚动一点,然后最终在相邻的两行之间来回弹跳。如果 I 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>

顺便说一句,即使我的所有事件处理程序的代码隐藏都被注释掉了,这种行为也会发生。

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

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

1 回答 1

6

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

您的问题是您使用的是“结构”。解决您的问题的简单方法是使您的结构成为一个

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

只需将struct单词更改为class即可解决您的问题。

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

因此,总而言之,DataGrid 在确定您正在选择哪个项目(或使用箭头键移动)时​​存在问题,因为列表中的许多对象被认为是“相同的”或“相等的”。这就是为什么它会感到困惑。诚然,我认为这是一个数据网格错误(或者至少是设计使然的奇怪行为),但是将数据类型从结构更改为类应该可以帮助您重回正轨!

干杯

于 2012-07-05T11:45:54.333 回答