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

时间:2011-10-20 19:58:18

标签: c# wpf wpf-controls wpfdatagrid attached-properties

WPF DataGrid类(不是Windows窗体DataGrid!)可以设置为在没有外部ScrollViewer的情况下自动处理滚动,并且可以为控件的内部滚动条注册事件处理程序通过编写像这样的XAML:

<DataGrid ScrollViewer.ScrollChanged="dGrid_ScrollChanged"  />

如果我错了,请纠正我,但在这种情况下,内部ScrollViewer似乎是某种未记录的附加属性。 ScrollViewer不是DataGrid的公共字段,您将在DataGrid文档中找不到ScrollViewer或ScrollChanged事件的引用。换句话说,仅仅执行myDataGrid.ScrollViewer.ScrollChanged += dGrid_ScrollChanged不起作用。

所以我的问题是,如何在运行时为此ScrollChanged事件添加或删除事件处理程序?我试图理解这里发生的事情,因为我正试图解决问题,所以解释越多越好。

2 个答案:

答案 0 :(得分:6)

尝试在你的代码中使用UIElement的AddHandler和RemoveHandler -

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

由于ScrollViewer不是dataGrid的依赖属性,因此需要使用AddHandler进行挂钩。就像你不能像这样设置Grid.RowSpan dg.Grid.RowSpan = 2 你必须像dg.SetValue(Grid.RowSpanProperty, 2)那样设置附加属性 您需要为附加属性挂钩的事件也是如此。

答案 1 :(得分:0)

您可以使用UIElement.RemoveHandler方法。

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

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

ScrollViewer.ScrollChanged不是DataGrid的属性,但是它可以在使用ScrollViewer

的FrameworkElements上使用的附加属性