我在 Silverlight 5 DataGrid 的checkbox
列中使用itemtemplate
。
我面临一个奇怪的问题。当我选择多个checkbox
然后向上和向下滚动网格时,选择会转移到其他checkbox
。
答案 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,这样你就可以分离出事件处理程序了 复选框滚出视图。