2012-06-19 63 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) –