c# - 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){}
}
解决方案
推荐阅读
- javascript - Get the domain of the website requesting to access another website
- python - Python CNTK如何在没有克隆的情况下替换输入
- ruby - 从带有括号的字符串中捕获所有关键字 rails
- mysql - SELECT 将检查超过 MAX_JOIN_SIZE 行
- amazon-web-services - 将 AWS Lambda 部署到多个区域?
- javascript - NodeJS 从 Api 加载画廊中的新图像(间隔)
- angular - Angular5:无法获取firebase对象
- image - PyTorch 中的转换用于什么?
- bash - 在 bash 脚本中实现空运行
- javascript - JS 相当于 .NET 的 MemoryStream.Read