2011-10-20 57 views
2

可以将WPF DataGrid类(不是Windows窗体DataGrid!)设置为在没有外部ScrollViewer的情况下自动处理滚动,并且可以为控件的内部注册事件处理程序通过滚动条等一样写XAML:附加事件?如何在运行时删除WPF DataGrid的ScrollChanged事件处理程序

<DataGrid ScrollViewer.ScrollChanged="dGrid_ScrollChanged" /> 

纠正我,如果我错了,但在这种情况下,内部的ScrollViewer似乎是某种形式的无证附加属性。 ScrollViewer不是DataGrid的公共字段,您将在DataGrid文档中找不到对ScrollViewer或ScrollChanged事件的引用。换句话说,简单地做myDataGrid.ScrollViewer.ScrollChanged += dGrid_ScrollChanged不起作用。

所以我的问题是,如何在运行时为此ScrollChanged事件添加或删除事件处理程序?我试图理解这里发生的事情,尽可能多地解决问题,让更多的解释变得更好。

回答

4

尝试使用的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) 同样需要钩住附加属性的事件。

+0

更新了我的回答与评论。希望这可以帮助。 –

+0

这真的有用吗?你不应该在'RemoveHandler'中传递'Delegate'的同一个实例吗? – JobaDiniz

0

您可以使用UIElement.RemoveHandler方法。

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

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

ScrollViewer.ScrollChanged不是DataGrid中的一个属性,但它的连接,你可以在使用FrameworkElements使用属性ScrollViewer