我正在修改标准的 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){}
}