WPF c# Inherited Dependency Object: how do you release instance events?

218 views Asked by At

I am modifying the standard WPF Grid.

On it I have several ObservableItemCollections that are dependency properties.

These dependency properties have Property Changed Callbacks that set instance event handlers to the CollectionChanged and ItemChanged events.

The Observable Collections work internally to the control and are not linked to the ViewModel.

The Grid doesn't appear to have a dispose method and the deconstructor isn't being called.

How do I release the events as I'm getting a memory leak?

Many thanks in advance.

Example Code:

    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){}

}
0

There are 0 answers