在上图中可以看到,我使用DataGridTemplateColumn.CellTemplate在第一列添加了CheckBox,在DataGrid的LoadingRow事件中根据行对应的数据中的一个字段判定此CheckBox的IsChecked是True还是False。
这样做是没什么问题的,可偏偏就是在滚动DataGrid的垂直滚动条时发生了问题,请看图:
就是这样的效果,有时候滚动的太激烈了所有的CheckBox都选上了。这还好,而且详情部分(即嵌套的DataGird部分)有的会自动展开,有的会自动合起来,反正就是变得一塌糊涂!!
类似的情况还有如果在列模板中嵌套了ComboBox,那么在选中了选项后再滚动VerticalScroll,然后,有时选择的选项也会丢失!
跪求高手啊,小弟实在不才啊,搞得快晕了!!
出现这个问题应该是你的某个逻辑设置错误了,SL没这个bug,虽然我也没办法帮你解决。
谢谢,请问你有做过类似的功能吗?能不能说说是怎么做的,或者给个Demo也行啊!
@TigerSpringLiu: 以前简单做过,但没到你这个程度。而且也有两年了。
1,LoadingRow这个事件没明白你想干啥,如果是绑定的话你直接把CheckBox的IsChecked={binding 字段}不就行了,
再如果你绑定的这个字段不是bool类型的那就绑定一个converter自己转换一下
2,如果你还干别的事情了就把你的后台代码贴出来好让大牛们给你分析,你逻辑出问题了
后台代码如下:
private void dgDelivery_LoadingRow(object sender, DataGridRowEventArgs e)
{
SalesDeliveryHead head = e.Row.DataContext as SalesDeliveryHead;
if (head.IsDispatch == false)
{
(e.Row.Columns[0].GetCellContent(e.Row).FindName("CheckBox") as CheckBox).IsChecked = true;
}
}
请赐教!多谢!
@TigerSpringLiu:
"就是这样的效果,有时候滚动的太激烈了所有的CheckBox都选上了"
我觉得问题应该出在LoadingRow这个事件上,你加断点跟一下是不是滚动的时候一直在触发这个时间造成的,
应该是你滚动一下触发一下,滚动的快了就出发多次,造成上次没有执行完下次又继续执行,
解决方法:使用我给你说的第一条,废弃这个事件
其实,我的需求还是比较复杂的,类型转换器根本没办法解决。
因为我要根据每行的数据除了设置CheckBox的IsCheckBox属性,还要设置行的背景色等其他需求。
没辙,后来发现了DataGrid的事件UnLoadingRow。
查看了一下msdn,发现这么一段:
为改善性能,EnableRowVirtualization 属性默认设置为 true。 当 EnableRowVirtualization 属性设置为 true 时,DataGrid 不会针对绑定数据源中的每个数据项实例化 DataGridRow 对象。 而是,DataGrid 只会在需要时创建 DataGridRow 对象,然后尽可能重复利用。 例如,DataGrid 为当前位于视图中的每个数据项创建一个 DataGridRow 对象,并在行滚出视图之外时回收它。
借助于此事件,您可以在重用某行之前对其进行任何必需的更改。 您通常使用此事件来撤消在 LoadingRow 事件处理程序中所做的任何更改。(http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=zh-cn&k=k(SYSTEM.WINDOWS.CONTROLS.DATAGRID.UNLOADINGROW);k(VS.XAMLEDITOR);k(TargetFrameworkMoniker-%22SILVERLIGHT%2cVERSION%3dV4.0%22)&rd=true)
说实话,我看到这一段太高兴了,以为只要设置一下EnableRowVirtualization属性为false就万事大吉了。因为数据量并不大,所以性能暂时可以不考虑的。
呵呵,只可惜Silverlight 中的 DataGrid却没有此属性,也找不到相关的属性,郁闷!
没办法,现在就只能在UnLoadingRow事件上打主意了。所以,就在此事件中做了与LoadingRow事件中相反的工作。效果还不错,至少现在拼命的滚动鼠标,每行的CheckBox或者背景色不会变得乱七八糟了!
就算个折中解决方案吧!至少现在解决问题了 ^_^