【问题标题】:Attached Event? How to remove ScrollChanged event handler for WPF DataGrid at runtime附加事件?如何在运行时删除 WPF DataGrid 的 ScrollChanged 事件处理程序
【发布时间】:2011-12-12 02:15:14
【问题描述】:

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

<DataGrid ScrollViewer.ScrollChanged="dGrid_ScrollChanged"  />

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

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

【问题讨论】:

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


    【解决方案1】:

    尝试在您的代码中像这样使用 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)这样的附加属性 需要为附加属性挂钩的事件也是如此。

    【讨论】:

    • 用 cmets 更新了我的答案。希望这会有所帮助。
    • 这真的有效吗?你不应该在RemoveHandler 中传递Delegate 的同一个实例吗?
    【解决方案2】:

    你可以使用UIElement.RemoveHandler方法。

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

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

    ScrollViewer.ScrollChanged 不是 DataGrid 的属性,但它是您可以在使用 ScrollViewer 的 FrameworkElements 上使用的附加属性

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      相关资源
      最近更新 更多