首页 > 解决方案 > WPF c# Inherited Dependency Object:如何释放实例事件?

问题描述

我正在修改标准的 WPF 网格。

在它上面我有几个 ObservableItemCollections 是依赖属性。

这些依赖项属性具有将实例事件处理程序设置为 CollectionChanged 和 ItemChanged 事件的 Property Changed 回调。

Observable Collections 在控件内部工作,不链接到 ViewModel。

Grid 似乎没有 dispose 方法,并且没有调用解构器。

当我遇到内存泄漏时如何释放事件?

提前谢谢了。

示例代码:

    public class ChDynamicGrid : Grid 
{
    #region Dependency Properties

    public ObservableItemCollection<CHColumnDefinition> CHColumnDefinitions
    {
        get { return (ObservableItemCollection<CHColumnDefinition>)GetValue(CHColumnDefinitionsProperty); }
        set { SetValue(CHColumnDefinitionsProperty, value); }
    }

    public static readonly DependencyProperty CHColumnDefinitionsProperty =
        DependencyProperty.Register(
            "CHColumnDefinitions",
            typeof(ObservableItemCollection<CHColumnDefinition>),
            typeof(ChDynamicGrid),
            new PropertyMetadata(null, new PropertyChangedCallback(OnColumnDefinitionsChanged))
         );


    #endregion //Dependency Properties

    public ChDynamicGrid() : base()
    {
        ShowGridLines = true;
        CHColumnDefinitions = new ObservableItemCollection<CHColumnDefinition>();
    }

    ~ChDynamicGrid()
    {
        this.CHColumnDefinitions.ItemChanged -= CHColumnDefinitions_ItemChanged;
        this.CHColumnDefinitions.CollectionChanged -= CHColumnDefinitions_CollectionChanged;

    }

    private static void OnColumnDefinitionsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var g = (ChDynamicGrid)d;
        if (g == null) return;
        if (e.OldValue != null)
        { 
            ((ObservableItemCollection<CHColumnDefinition>)e.OldValue).ItemChanged -= g.CHColumnDefinitions_ItemChanged;
            ((ObservableItemCollection<CHColumnDefinition>)e.OldValue).CollectionChanged -= g.CHColumnDefinitions_CollectionChanged;
        }
        if (e.NewValue != null)
        {
            ((ObservableItemCollection<CHColumnDefinition>)e.NewValue).ItemChanged += g.CHColumnDefinitions_ItemChanged;
            ((ObservableItemCollection<CHColumnDefinition>)e.NewValue).CollectionChanged += g.CHColumnDefinitions_CollectionChanged;
        }
    }


    private void CHColumnDefinitions_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e){}

    private void CHColumnDefinitions_ItemChanged(object sender, ItemChangedEventArgs<CHColumnDefinition> e){}

}

标签: c#wpfwpf-controlsdependencyobject

解决方案


推荐阅读