我在Silverlight 5 DataGridcheckbox
的itemtemplate
列中使用。我面临一个奇怪的问题。当我选择多个然后上下滚动网格时,选择会转移到其他一些.checkbox
checkbox
2 回答
我在我的代码中解决了这个问题。我在网格的 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 代码。
这是一种已知行为,因为 Silverlight 在 DataGrid 中重用其图形资源。在此 Silverlight 线程中有关于它的讨论。
似乎解决它的一种方法是对 IsSelected 属性进行数据绑定:
我当时的解决方案是在我的数据源中添加一个新属性:IsSelected,并将复选框绑定到该值。
您在此线程中有更多附加信息,微软在其中回答:
这不是错误。当您在 DataGrid 中滚动时会发生相同的复选框用于新数据,因为 DataGrid 会回收视觉效果。当您的新数据具有不同的值时,检查将通过 Binding 更改,您将收到事件。要使此方案正常工作,您可以做的是收听当一行出现时引发的 LoadingRow。在那里,您可以调用 column.GetCellContents 来获取单元格的内容。这将为您提供 CheckBox,此时您可以附加到 CheckChanged。如果你这样做,你需要做类似的事情并听 UnloadingRow 以便在复选框被滚动到视图之外时分离事件处理程序。