2009-08-26 14 views
1

Silverlightを使用する問題追跡システムを構築しています。私はDataGridsを使用して問題リストを表示し、選択したインデックスを-1に設定して行が選択されていないようにしてから、選択変更イベントを使用して選択した特定の問題の問題の詳細ウィンドウをポップアップします。Silverlight Datagrid SelectionChangedバインディングによるデータのリフレッシュ

DataGridをItemsSourceに再バインドしてリフレッシュしようとすると、SelectionChangedイベントが無効になり、DataGridがItemsSourceに再バインドされ、SelectedIndexが-1に設定され、SelectionChangedイベントが再度有効になります。しかし、(DataGrid_Loadedイベントの後まで)SelectionChangedイベントの再有効化をどれだけ遅くしても、SelectionChangedイベントが発生し、問題の詳細ウィンドウがポップアップします。

SelectedIndexを変更しないDataGridのデータを更新するには、より良い方法がありますか?そうでない場合は、人為的なやりとりではなく、プログラムによるインデックスの変更によって引き起こされるイベントを知らせる方法がありますか?

(また、議論のためのアップ、これは仕事に最適制御のですか?私はユーザ等、状況によって要求され、このような問題のタイトルのように、行ごとに複数のフィールド、割り当てられたユーザーを表示する必要があります)前もって感謝します。

答えて

2

これまで、comctl32 ListViewコントロールの選択イベントで同様の問題が発生しました。プログラマティックな選択原因選択イベントが発生する可能性があります。

この問題の回避策は、イベントハンドラが選択イベントを気にする必要があるかどうかを知ることができるようにグリッド単位/リストカウンタの変数を持たせることです。コードは次のようになります:

int issueList_ProgrammaticEventCount_Selection = 0; 

void refreshIssueList() 
{ 
    ++issueList_ProgrammaticEventCount_Selection; 
    issueList.ItemsSource = ...; 
} 

void issueList_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (issueList_ProgrammaticEventCount_Selection > 0) 
    { 
     --issueList_ProgrammaticEventCount_Selection; 
     return; 
    } 

    showIssueDetails(); 
} 
関連する問題