Silverlight DataGrid中的复选框表现得很奇怪

时间:2012-10-18 18:00:23

标签: silverlight checkbox

我在 Silverlight 5 DataGrid checkbox列中使用itemtemplate。 我面临一个奇怪的问题。当我选择多个checkbox然后向上和向下滚动网格时,选择会转移到其他checkbox

2 个答案:

答案 0 :(得分:4)

我在我的代码中解决了这个问题。我在网格的LoadingRow和UnloadingRow事件中进行了处理。 一旦加载了一行,我们就需要查看我们希望保持选中或取消选中复选框的条件。但是一旦设置了IsChecked属性,复选框的Checked或UnChecked事件就会被触发。 在这种情况下,我们可以取消注册复选框的Checked和UnChecked事件(如果有的话),设置IsChecked属性。设置完成后,再次注册事件。

以下是您的帮助代码。

将LoadRow和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;
        }
    }

这样我就不必费心在我的Checked和UnChecked事件中添加一些hake代码了。

答案 1 :(得分:3)

这是一种已知行为,因为Silverlight正在重新使用DataGrid中的图形资源。在this Silverlight thread中有关于它的讨论。

似乎解决这个问题的一种方法是对IsSelected属性进行数据绑定:

  

我当时的解决方案是在我的数据源中添加一个新属性:   IsSelected,并将复选框绑定到该值。

您还有其他信息in this thread,Microsoft回答:

  

这不是错误。当您在中滚动时会发生什么   DataGrid与用于新数据的复选框相同,因为   DataGrid回收视觉效果。当您的新数据有所不同时   值,检查将通过Binding更改,您将收到   事件。让这个场景发挥作用你能做的就是倾听   在行进入视图时引发的LoadingRow。在那里,   你可以调用column.GetCellContents来获取单元格的内容。   这将为您提供CheckBox,您可以将其附加到CheckChanged   这次。如果你这样做,你需要做类似的事情   听取UnloadingRow,这样你就可以分离出事件处理程序了   复选框滚出视图。