项目库 +转换器 + treeview不会更新
-
22-08-2019 - |
题
这是相当复杂的,希望我能够清楚地表明有人可以帮助我。我有一个对象,让我们称其为经理,经理有一个他管理的人的集合,所有人都实现了iperson,但是不同类型的人具有不同的属性。我想在树上展示此经理,在经理节点下,我想显示他正在管理的所有项目,这些项目可以从他管理的人员中确定。
因此,计划是使用转换器将人转换为项目列表。这是XAML:
<HierarchicalDataTemplate DataType="{x:Type ui:Manager}">
<TextBlock Text="{Binding Path=Name}"/>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate.ItemsSource>
<Binding Path="People">
<Binding.Converter>
<configUtil:ProjectListConverter/>
</Binding.Converter>
</Binding>
</HierarchicalDataTemplate.ItemsSource>
</HierarchicalDataTemplate>
我的人类的班级实现了InotifyPropertychanged,并且列表中的人们实现了InotifyCollectionChanged。此代码在我设置Treeview itempssource时效果很好,经理将显示其项目列表。
但是,当我在人列表中添加一个新人时,TreeView不会更新。当我调试时,我可以看到Collection Changed正在用添加操作和添加项目启动。同样,收集变化的事件不是零事件,所以我知道UI正在观看。但是当添加项目时,转换器不会执行。
这是保存iPerson对象的列表的添加方法:
public void Add(T item)
{
list.Add(item);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
}
我是否以某种方式打破数据指标?
我还能检查什么其他东西?
转换器仅查看人们列表中的每个项目,并弄清楚他们正在从事的项目,并将项目名称添加到输出列表中。
解决方案
将转换器应用于存储集合的属性。因此,只有当集合实例本身更改时,才会调用(当收集中的项目更改时)。解决此问题的一种方法是,当您希望收集刷新时,将其无效。
使收集属性无效并导致转换器代码再次运行的最简单方法是 null
取消收藏并重新分配它。另一种方法是获得 BindingExpression
(通过 BindingOperations
)并打电话 UpdateTarget
. 。最后,您可以绑定到 CollectionView
(或其子类)并致电 Refresh
在上面。
如果你 真的 想要干净地解决问题,您可以绑定到自己的实施 ICollectionView
进行过滤并根据需要提出事件。