2011-10-20 86 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