2012-10-18 33 views

回答

3

這是自Silverlight在DataGrid中重新使用其圖形資源以來的已知行爲。有關this Silverlight thread的討論。

這似乎解決它的方法之一是數據綁定IsSelected屬性:

我當時的解決辦法是在我的數據源中添加一個新的屬性: IsSelected,並複選框以結合值。

您有更多的額外信息in this thread,其中微軟的答案:

這是不是一個錯誤。當您在 中滾動時會發生什麼情況DataGrid與用於新數據的複選框相同,因爲 DataGrid會回收視覺效果。當您的新數據具有不同的 值時,檢查將通過綁定進行更改,您將收到 事件。你可以做些什麼來實現這個場景的工作,那就是讓 加載到LoadingRow中,這是在行進入視圖時引發的。在那裏, 你可以調用column.GetCellContents來獲取單元格的內容。 這會給你CheckBox,這次你可以附加到CheckChanged 。如果你這樣做,你需要做類似的事情,並且 監聽UnloadingRow,這樣當 複選框滾動到視野外時,你可以分離事件處理器。

4

我在我的代碼中修復了這個問題。我沒有在網格的LoadingRow和UnloadingRow事件中處理。 只要加載一行,我們就需要查找條件,我們希望保持該複選框處於選中狀態或未選中狀態。但是,只要您設置了IsChecked屬性,複選框的Checked或UnChecked事件就會被解僱。 在這種情況下,我們可以取消註冊複選框的Checked和UnChecked事件(如果有),請設置IsChecked屬性。設置完畢後,再次註冊事件。

以下是您的幫助代碼。

將LoadingRow和UnloadingRow事件添加到您的網格。

... LoadingRow = 「DGUserList_RowLoadUnload」 UnloadingRow = 「DGUserList_RowLoadUnload」>

在隱藏文件代碼:

private void DGUserList_RowLoadUnload(object sender, DataGridRowEventArgs e) 
    { 
     DataGridRow row = e.Row; 
     CheckBox cbox = (CheckBox)this.dgUserList.Columns[0].GetCellContent(row); 
     this.UpdateHookedEventsForCheckBox(cbox, false); 
     cbox.IsChecked = true; // Here put your condition for check/uncheck 
     this.UpdateHookedEventsForCheckBox(cbox, true); 
    } 

    private void UpdateHookedEventsForCheckBox(CheckBox chkBox, bool register) 
    { 
     if (register) 
     { 
      chkBox.Checked += this.CheckBox_Checked; 
      chkBox.Unchecked += this.CheckBox_Unchecked; 
     } 
     else 
     { 
      chkBox.Checked -= this.CheckBox_Checked; 
      chkBox.Unchecked -= this.CheckBox_Unchecked; 
     } 
    } 

這樣我就不必過問把一些鱈魚代碼在我經過和UnChecked事件。

+0

它通過很小的修改幫助了我很多。非常感謝。 –