4

私はしばらくの間使用してきた WPF DataGrid を持っていますが、うまく機能します。ここにある他のポスターとは異なり、スクロールバーやマウス ホイールに問題はありませんでした (まだ)。DataGrid の最後に移動するようにCTRLENDプログラムし、最後に追加された項目を追跡します。DataGridキーでコンテンツを上にスクロールできupます。

しかし、私はキーで本当に奇妙な動作をしていdownます! 上から開始しDataGriddownキーを押したままにすると、少しスクロールしてから、最終的に隣接する 2 つの行の間を行ったり来たりします。Ipgdnの場合、さらに下にスクロールし、ジャンプする前の 2 つの行の一番上に戻り、I が移動したポイントまで下にスクロールしpgdnます。さらにページダウンすると、downキーが最後までスクロールします。の先頭に移動してDataGrid最初からやり直すと、まったく同じ動作が何度も繰り返されます。

これに対処する投稿をまだ見つけていませんDataGrid。ドキュメントにも役立つものは何もありません。

これDataGridは、各列にTextBlocks が表示される 3 列の です。スクロールのこの 1 つのモードだけが問題である理由を誰か説明できますか? 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; } 
}

構造体の単語をクラスに変更するだけで問題が解決するはずです。

構造体とクラスは同じではないことを理解する必要があり、構造体はそれらの値に基づいて (同じ型の) 別の変数との "同等性" を判断します (同じデータを含む特定の構造型の 2 つの変数は等しいと見なされます)。 )。classesの場合、別段の指定がない限り、等価性はそのメモリ アドレスによって決定されます。これにより、デフォルトでは、オブジェクトの 2 つのインスタンスが同じデータを含んでいても、同じメモリ アドレスに存在しないため、等しいとは見なされません (この動作は、"GetHashCode" および "Equals" メソッドを上書きすることで上書きできます)。任意のクラス定義で)。

結論として、リスト内の多くのオブジェクトは「同じ」または「等しい」と見なされるため、DataGrid では、選択している (または矢印キーで移動している) アイテムを判断する際に問題があります。それが混乱する理由です。確かに、これはデータグリッドのバグ (または、設計によるものである場合は少なくとも奇妙な動作) だと思いますが、データ型を構造体からクラスに変更すると、軌道に戻るのに役立ちます!

乾杯

于 2012-07-05T11:45:54.333 に答える