附加事件?如何在运行时移除WPF DataGrid的ScrollChanged事件处理程序

4

WPF DataGrid类(而不是Windows Forms DataGrid!)可以设置自动处理滚动,而无需外部ScrollViewer,并且可以通过编写以下XAML来为控件的内部滚动条注册事件处理程序:

<DataGrid ScrollViewer.ScrollChanged="dGrid_ScrollChanged"  />

请纠正我,如果我错了的话,在这种情况下,内部 ScrollViewer 看起来是某种未记录的附加属性。ScrollViewer 不是 DataGrid 的公共字段,因此您在 DataGrid 文档中找不到关于 ScrollViewer 或 ScrollChanged 事件的任何参考。换句话说,简单地执行 myDataGrid.ScrollViewer.ScrollChanged += dGrid_ScrollChanged 是无效的。
那么我的问题是,如何在运行时添加或删除此 ScrollChanged 事件的事件处理程序?我试图理解这里发生了什么,尽可能多的解释会更好。
2个回答

7

在您的代码后端,尝试使用UIElement的AddHandler和RemoveHandler,如下所示:

dg.AddHandler(ScrollViewer.ScrollChangedEvent, new ScrollChangedEventHandler(dg_ScrollChanged));
dg.RemoveHandler(ScrollViewer.ScrollChangedEvent, new ScrollChangedEventHandler(dg_ScrollChanged));

由于 ScrollViewer 不是您的数据表格的依赖属性,因此您需要使用 AddHandler 进行挂钩。就像您不能简单地设置 Grid.RowSpan 一样 dg.Grid.RowSpan = 2 ,您必须设置附加属性,例如 dg.SetValue(Grid.RowSpanProperty, 2) 对于事件也是如此,您需要挂钩附加属性。


已更新我的回答并添加了注释。希望这有所帮助。 - Rohit Vats
1
这真的有效吗?在“RemoveHandler”中,难道不应该传递相同的“Delegate”实例吗? - JobaDiniz

0

您可以使用UIElement.RemoveHandler方法。

如果您的网格有一个名称:"grid",那么您可以这样做:

grid.RemoveHandler(ScrollViewer.ScrollChangedEvent, new ScrollChangedEventHandler(dGrid_ScrollChanged));

ScrollViewer.ScrollChanged不是DataGrid的属性,而是一种附加属性,您可以在使用ScrollViewer的FrameworkElement上使用它


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接