在DataContext设置为null

时间:2016-03-21 20:45:15

标签: c# .net wpf memory-leaks itemscontrol

更新:为了澄清,这是一个关于内存泄漏的问题,而不是关于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>

1 个答案:

答案 0 :(得分:1)

您可以在这里获得解释 https://stackoverflow.com/a/19511796/2696230

使用列表将导致强引用(内存泄漏)。简单的解决方案是将List更改为ObservableCollection,除非释放视图(本身)