2

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

4

2 回答 2

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;
        }
    }

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

于 2014-08-29T10:12:10.093 回答
3

这是一种已知行为,因为 Silverlight 在 DataGrid 中重用其图形资源。在此 Silverlight 线程中有关于它的讨论。

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

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

您在此线程中有更多附加信息,微软在其中回答:

这不是错误。当您在 DataGrid 中滚动时会发生相同的复选框用于新数据,因为 DataGrid 会回收视觉效果。当您的新数据具有不同的值时,检查将通过 Binding 更改,您将收到事件。要使此方案正常工作,您可以做的是收听当一行出现时引发的 LoadingRow。在那里,您可以调用 column.GetCellContents 来获取单元格的内容。这将为您提供 CheckBox,此时您可以附加到 CheckChanged。如果你这样做,你需要做类似的事情并听 UnloadingRow 以便在复选框被滚动到视图之外时分离事件处理程序。

于 2012-10-18T18:14:28.030 回答