更新:为了澄清,这是一个关于内存泄漏的问题,而不是关于UI无法刷新以反映新的null DataContext(该部分工作正常)。
看来,如果您将ItemsControl
的{{1}}设置为null,它将继续保留对其旧datacontext的引用,直到您为其分配一个新的那个为止不是空的。您可以使用问题底部的代码进行确认。单击"将DataContext设置为null",然后单击"收集垃圾"你想要多少次。 " Foo定稿"消息永远不会出现。然后单击"将DataContext设置为空对象",再次收集垃圾,您将立即看到终结器运行。
我的应用程序中存在内存泄漏,原因是假设我的DataContext
之一(ItemsControls
)将在DataGrid
之后释放其对旧datacontext的所有引用。为什么不呢?这是预期的行为吗?
更新:VS2015诊断工具在单击"将DataContext设置为null"后提供的路径。看起来像这样。 TheGrid.DataContext = null
本身来自我的代码之后,我没有想到任何事情:
Foo
Foo
ListDictionary+DictionaryNode
ListDictionary
ListDictionary+DictionaryNode
ListDictionary
HybridDictionary
[强手柄] XAML:
Object[]
C#:
<Window x:Class="WpfApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<ItemsControl ItemsSource="{Binding Foos}" />
<Button Content="Set DataContext to null" Click="SetDataContextToNullClicked"/>
<Button Content="Set DataContext to empty object" Click="SetDataContextToEmptyObjectClicked" />
<Button Content="Collect garbage" Click="CollectGarbageClicked"/>
</StackPanel>
</Window>
答案 0 :(得分:1)
您可以在这里获得解释 https://stackoverflow.com/a/19511796/2696230
使用列表将导致强引用(内存泄漏)。简单的解决方案是将List
更改为ObservableCollection
,除非释放视图(本身)