2012-06-19 64 views
4

我有一段WPF DataGrid,我已经使用了一段时间,它的效果很好。不同于这里的其他海报,我还没有与滚动条或鼠标滚轮(还)的问题。我有CTRLEND编程到DataGrid的末尾,然后跟踪最近添加的项目。我可以通过以上的键向上滚动浏览DataGrid内容。WPF DataGrid滚动向下箭头键奇怪行为

但是,我真的很奇怪的行为与下降关键!如果我从DataGrid的顶部开始并按住下一个键,它会滚动一下,然后最终在两个相邻行之间来回跳动。如果我将它向下滚动更多,然后跳回到它将在其之间跳转的前两行的最上面,然后向下滚动到我要去的点。如果我再往下看,下降键将滚动到结尾。如果我进入DataGrid的顶部并重新开始,我会一次又一次地得到完全相同的行为。

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

这只是一个三列DataGrid,其中每列显示TextBlock s。任何人都可以解释为什么只有这种滚动模式有问题吗?这里的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; } 
} 
+0

我得到奇怪的行为也当使用WPF和网格,甚至到了Visual Studio的崩溃导致它运行的内存点,大概增加了一些更多的RAM将会帮助你 – JohnnBlade

+3

添加更多的内存是永远的解决方案来解决内存异常。 ;)也许你的datagrid单元格正在使用需要'Dispose'd的对象。 – Dave

+1

您的MainLog集合中的类是否具有Equals方法的自定义实现? –

回答

6

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

你的问题是你正在使用“结构”。简单的解决问题的方法就是让你结构一个

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

只是改变了结构级应该解决您的问题。

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

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

干杯

+0

感谢您的提示 - 我会研究这一点,并会让你知道! – Dave

+0

我用我试图显示的结构的定义更新了我的OP。 – Dave

+1

+1。我建议你阅读[这个问题](http://stackoverflow.com/questions/3841602/why-is-valuetype-gethashcode-implemented-like-it-is),如果你想知道'ValueType.GetHashCode'如何工作。 另外,一个结构应该是不可变的(即'private set')。看到这里进一步的解释:[为什么是可变结构邪恶](http://stackoverflow.com/questions/441309/why-are-mutable-structs-vil) –