Dav*_*ave 4 c# wpf datagrid .net-4.0 wpfdatagrid
我有一段时间以来一直使用的WPF DataGrid,效果很好.与其他海报不同,我还没有滚动条或鼠标滚轮的问题.我已CTRLEND编程到DataGrid的末尾,然后它跟踪最近添加的项目.我可以DataGrid用up键向上滚动内容.
但是,我对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)
好的...我用字符串复制了行为(绑定到数据网格的简单字符串列表).当我在列表中引入重复字符串时,行为开始发生.似乎数据网格在"选定索引"和"选定值"之间混淆.同类的事情发生时,我尝试选择一个值(一个字符串,在我的测试)上存在另一个可见行:选择被搞砸了:一半的时候,没有选择正确的行.
你的问题是你正在使用"结构".解决问题的简单方法是使结构成为一个类:
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(或至少陌生人的行为,如果它是由设计),但是从结构改变你的数据类型,一类可以帮助你回到正轨!
干杯
| 归档时间: |
|
| 查看次数: |
1676 次 |
| 最近记录: |