Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 使用虚拟化模式时,TreeView错误地将项目显示为已展开。回收_Wpf_Treeview_Virtualization_Ui Virtualization - Fatal编程技术网

Wpf 使用虚拟化模式时,TreeView错误地将项目显示为已展开。回收

Wpf 使用虚拟化模式时,TreeView错误地将项目显示为已展开。回收,wpf,treeview,virtualization,ui-virtualization,Wpf,Treeview,Virtualization,Ui Virtualization,每当我使用TreeView时,我总是只有几个节点,每个节点通常只有不到100个项目。我从来没有真正需要任何类型的ui虚拟化,但现在我第一次需要它 当在回收模式下使用ui虚拟化时会出现问题TreeView似乎会扩展项目,尽管我从未手动扩展过它们 我在谷歌上搜索了这个问题,据我所知,TreeView中的虚拟化回收模式可以重用容器 因此,我假设原因可能是将已扩展的重用容器应用于以前未扩展的项 下面是一个简单的例子: 对于那些因为任何原因无法下载代码的人,这里基本上就是我用TreeView所做的 这就

每当我使用TreeView时,我总是只有几个节点,每个节点通常只有不到100个项目。我从来没有真正需要任何类型的ui虚拟化,但现在我第一次需要它

当在回收模式下使用ui虚拟化时会出现问题TreeView似乎会扩展项目,尽管我从未手动扩展过它们

我在谷歌上搜索了这个问题,据我所知,TreeView中的虚拟化回收模式可以重用容器

因此,我假设原因可能是将已扩展的重用容器应用于以前未扩展的项

下面是一个简单的例子:

对于那些因为任何原因无法下载代码的人,这里基本上就是我用TreeView所做的

这就是我在XAML中拥有的

     <Grid>
        <TreeView ItemsSource="{Binding}" VirtualizingStackPanel.IsVirtualizing="True"  VirtualizingStackPanel.VirtualizationMode="Recycling">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Parts}">
                    <TextBlock Text="{Binding Name}"/>
                    <HierarchicalDataTemplate.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding}"/>
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    </Grid>

这是代码隐藏:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            IList<Car> list = new List<Car>();
            for (int i = 0; i < 5000; i ++)
            {
                list.Add(new Car() { Name = "test1" + i });
            }

            foreach (var car in list)
            {
                car.Parts = new List<string>();
                for (int i = 0; i < 500; i++)
                {
                    car.Parts.Add("asdf" + i);
                }
            }

            this.DataContext = list;
        }
    }

    public class Car
    {
        public string Name
        {
            get;
            set;
        }

        public List<string> Parts
        {
            get;
            set;
        }
    }
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
IList list=新列表();
对于(int i=0;i<5000;i++)
{
添加(新车(){Name=“test1”+i});
}
foreach(列表中的var车辆)
{
car.Parts=新列表();
对于(int i=0;i<500;i++)
{
car.Parts.Add(“asdf”+i);
}
}
this.DataContext=list;
}
}
公车
{
公共字符串名
{
得到;
设置
}
公开零件清单
{
得到;
设置
}
}
我希望有人能给我一个解决这个问题的办法。这是已知的bug吗


很抱歉,这是重复的。此外,我希望你们告诉我我做错了什么,因为这是我在你们降级问题之前的第一篇帖子。

你们可能知道,使用标准回收模式可以轻松解决这个问题:

<TreeView VirtualizingStackPanel.VirtualizationMode="Standard" ...>

您可以在Josh Smith的优秀文章中找到有关如何准确创建此类视图模型的更多信息。

使用容器回收是绝对必须的吗?使用标准虚拟化模式不会对性能产生太大的影响,它会解决您的问题。我非常有兴趣在不使用标准虚拟化的情况下解决这个问题。我想看看你们会提出什么样的想法或建议。我从哪里来的人都说,生命中唯一必须的就是死亡。这不是绝对必须的,但我想弄清楚如何使这项工作。希望这里很少有其他人也喜欢这样。我认为需要一些wpf黑客来解决这个问题。我偶然发现了一只令人兴奋的虫子,不是吗?是的,我还想到了iExpanded。我将把这标记为解决方案,但我们中间还有一个问题。正如我在问题中提到的,我需要使用虚拟化,因为我有大量的数据。如果不绑定到iExpanded,我如何解决此问题?我的意思是,这是一个相当大的内存问题,因为我从数据库中获取实体,并且我需要使用isExpanded属性扩展每个实体。这意味着对于20000个简单实体,我将在内存中获得40000个创建的对象。那不好。你能告诉我一种方法来解决这个问题吗?没有绑定到IsExanded的回收模式?虚拟化的标准模式必须将信息保存在某个地方,因为标准工作时没有绑定到IsExpanded属性。为什么回收模式不能采用与标准虚拟化模式相同的行为?这是一个好问题。我不确定这些数据保存在哪里,检查一下会很有趣。至于另一种解决方案,我现在想不出任何解决方案,但您可以利用将依赖项属性保存在内存中的方式来减少内存使用。您可以让viewmodel继承自
DependencyObject
,并将
IsExpanded
定义为具有默认值
false
的依赖项属性。这样,布尔值将仅保存在扩展项的内存中。另外,为了减少总体内存,您应该看看数据虚拟化。感谢您的快速回复。我读过关于ui虚拟化的所有魔法,在标准模式下,生成器调用方法remove,而在回收模式下,生成器管理已实现容器的缓存。使用生成器,我指的是为物品创建容器。所以我想我们在调试VirtualzingStackPanel的源代码时会找到问题的答案。你们知道我如何在VS2012中调试该面板的源代码吗?你们甚至可以从VS2012中的符号加载和打开源代码吗?我不能。我已将设置设置为允许从microsoft server下载符号,但该设置不起作用。我启用了所有nessacary选项,比如进入.net framework代码时的勾号,但仍然没有启用。
class TreeViewItemViewModel : INotifyPropertyChanged
{
    bool IsExpanded { get; set; }
    bool IsSelected { get; set; }
    TreeViewItemViewModel Parent { get; }
    ObservableCollection<TreeViewItemViewModel> Children { get; }
}