我有一段时间以来一直使用的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; }
}
答案 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错误(或者至少是陌生的行为,如果它是设计的),但是将数据类型从结构改为类应该可以帮助你重回正轨!
干杯