问题描述
首先简要介绍一下背景: 我们有一个 TreeView,我们在其中打破了虚拟化,导致内存消耗大幅增加,直至出现 OutOfMemoryException。虽然这肯定是核心问题并且会得到解决,但我在分析问题时注意到了一些不同之处:我们的 MultiBindings 的内存消耗似乎巨大到我不相信的地步!
因此,我想在这里询问是否有人遇到过同样的情况,更重要的是,这是正常现象还是我的代码有问题。
首先是 TreeListViewCellDataTemplate 中有问题的绑定:
<treeListView:TreeListViewCellDataTemplate
TemplateEnum="{x:Static treeListView:DataTemplateEnum.something}">
<Border d:DataContext="{d:DesignInstance d:Type=treeListView:SomethingValueviewmodel}"
Background="{Binding Path=Index,Converter={StaticResource IndexToBackgroundConverter},Mode=OneTime}">
<TextBlock Margin="1,0" TextAlignment="Right" VerticalAlignment="Center">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource CaseLikeMultiConverter}">
<Binding Path="State" Mode="OneTime"/>
<Binding Source="{x:Static treeListView:SomethingValueState.UnInitialized}"/>
<Binding Source="?"/>
<Binding Source="{x:Static treeListView:SomethingValueState.Initialized}"/>
<Binding Path="Value" Mode="OneTime"/>
<Binding Source="{x:Static treeListView:SomethingValueState.KNown}"/>
<Binding Path="Value" Mode="OneTime"/>
<Binding Source="{x:Static treeListView:SomethingValueState.Conflicted}"/>
<Binding Source="≠"/>
<Binding Source="{x:Static treeListView:SomethingValueState.Unbounded}"/>
<Binding Source="≠"/>
<Binding Source="?"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Border>
</treeListView:TreeListViewCellDataTemplate>
我用上面的模板测量了内存消耗,同样的模板用 <TextBlock.Text>...</TextBlock.Text>
简单地注释掉了。在模板的 350 个实例上,我得到的内存消耗比注释掉的模板多约 13MB。每个 MultiBinding 实例大约 37KB!
我的测量方法有点临时,因为我只是比较了整个测试程序的托管内存消耗。对于注释掉的情况,大约为 79MB,而 MultiBinding 为大约 92MB。我试图通过多次运行这两个测量来使这更可靠,并且结果相对稳定,因此我对结果相当有信心。
我搜索了一段时间来寻找 MultiBinding 内存消耗的来源,但没有找到任何结果,这让我很困惑,因为我的结果。
最后的问题是:MultiBinding消耗这么多内存正常吗?我的 XAML 有问题吗?有没有什么方法可以在不替换 MultiBinding 的情况下对其进行优化?
编辑:感谢您的回复!
为了澄清我的问题,我不是在为这个特定的 MultiBinding 寻找解决方案。我知道我可以替换 MultiBinding 并使用视图模型代码(有点中断 MVVM)或特定的转换器。 我想知道为什么,尤其是何时 MultiBindings 消耗这么多内存。如果我不知道何时可以安全地使用 MultiBinding,我必须停止使用它们,测量每个实例或依靠我的直觉。
让我们举一个更经典的例子:
<TextBlock.Foreground>
<MultiBinding Converter="{StaticResource BoolToForegroundConverter}">
<Binding Path="IsSourcePathValid"/>
<Binding Path="IsSelected"/>
</MultiBinding>
</TextBlock.Foreground>
350 个实例的消耗约为 0.7MB,每个实例约为 2kb。对我来说,这似乎仍然令人惊讶,但它不会以如此快的速度失控,而且显然与更具攻击性的示例仍有很大不同。有人知道为什么吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)