WPF 中 MultiBinding 的内存消耗似乎极端

问题描述

首先简要介绍一下背景: 我们有一个 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 (将#修改为@)