我有一个用于导航本地Windows目录的WPF(.Net 4)ListView。它显示当前目录的内容,包括名称和大小以及所有内容。但是,在某些目录中,它显示的第一个元素显示两次。例如,假设在目录“D1”中我有子目录“W”,“X”,“Y”和“Z”。 ListView会说“W W X Y Z”,即使它绑定的实际数据(a ThreadObservableCollection)没有重复。当创建包含它的对象时,ThreadObservableCollection最初也是空的,子目录和文件在后台线程上找到,然后放入它们所在的集合中。
我对如何调试它感到茫然,因为它纯粹出现在演示区域,并且担心它可能是框架本身的错误。它不会出现在每个目录中,但它似乎(有些)可重复的,它确实发生在其中表明有一些模式在这里工作,虽然我还没有找到任何区别特征。如果真的发生的话,它也总是第一个条目。
我也尝试过收听ThreadObservableCollection的CollectionChanged事件,但它只会按照预期更改每个项目触发一次,并且我已经看到提供的值以确保没有重复项(没有重复项) )。
我还将DebugConverter(见下文)附加到包含所显示的(子)目录名称的TextBlock,它确实显示了重复的值。所以ListView中肯定有两个实际的行,后面有相同的项目,但我仍然不知道为什么。
我很欣赏有关可能出现问题的建议,甚至是如何试图找出它认为必须复制第一个条目的原因。
答案 0 :(得分:1)
我可能首先通过DebugConverter运行它(你必须编写它,我不认为有一个实现与.Net一起发布)。它看起来像这样:
(显然,在方法中的单行代码中将断点放在VS中。)
public class DebugConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}
现在,您可以在其中添加断点,并验证副本实际上是否在接口生成级别上升。检查文件的绝对路径(例如,它是默认的“。”,它代表当前目录,或类似的东西?它是否是其他地方的错误转换?我不知道为什么这只会发生在某些目录上,但首先将你的调试网络扩展开来。)
这可能不是一个线程问题,因为我认为Dispatcher控制与UI的所有交互,包括支持视图的observablecollection,这意味着它只能串行交互。但是,如果你没有使用ObservableCollection,你可能有线程?我怀疑WPF对任何支持枚举都相当严格,但我不确定。哦,等等,你说你正在使用一个ObservableCollection。好的,不能穿线。你是否正在使用DataTemplateSelector做任何事情?是否有应用视图模板的样式?你可以同时使用默认的Setter应用样式和Trigger包括另一个视图项吗?
让我们尽可能地努力,假设它是框架中的一个错误。根据我的经验,问题始终是我的代码,即使我不觉得它可能是在前面。
(发表评论)
即使你的收藏品在装订时是空的,你应该可以像这样访问各个元素:
<ListView>
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text='{Binding Path=filename, Converter={StaticResource DebugConverter}' />
...etc
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
您是否有机会发布您的代码?