这是相当复杂的,希望我能够清楚地表明有人可以帮助我。我有一个对象,让我们称其为经理,经理有一个他管理的人的集合,所有人都实现了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 进行过滤并根据需要提出事件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top