【问题标题】:ItemsSource + Converter + Treeview wont updateItemsSource + Converter + Treeview 不会更新
【发布时间】:2010-10-16 22:34:36
【问题描述】:

这个相当复杂,希望我能把它说清楚,以便有人帮助我。我有一个对象,我们称之为经理,经理有一组他管理的人,这些人都实现了 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>

我的 Person 类实现了 INotifyPropertyChanged,保存人员的列表实现了 INotifyCollectionChanged。当我设置树视图 ItemsSource 时,这段代码效果很好,经理们与他们的项目列表一起显示。

但是,当我向人员列表中添加新人员时,TreeView 不会更新。当我调试时,我可以看到 CollectionChanged 正在使用 Add 操作和添加的项目触发。 CollectionChanged 事件也不为空,所以我知道 UI 正在观看它。但是添加项目时转换器不会执行。

这里是保存 IPerson 对象的 List 的 Add 方法:

public void Add(T item)
{
    list.Add(item);
    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));
}

我是否以某种方式破坏了数据绑定?

我还可以检查哪些其他内容?

转换器只是查看人员列表中的每个项目并确定他们正在从事哪些项目并将项目名称添加到输出列表中。

【问题讨论】:

    标签: wpf converter itemssource inotifycollectionchanged


    【解决方案1】:

    转换器应用于存储集合的属性。因此,只有在集合实例本身发生变化时才会调用它(而不是在集合中的项目发生变化时)。解决此问题的一种方法是在您希望刷新集合时使其无效。

    使集合属性无效并导致转换器代码再次运行的最简单方法是将null 取出集合并重新分配它。另一种方法是获取BindingExpression(通过BindingOperations)并致电UpdateTarget。最后,您可以改为绑定到 CollectionView(或其子类)并在其上调用 Refresh

    如果您真的想彻底解决问题,您可以绑定到您自己的 ICollectionView 实现,它会根据需要进行过滤并引发事件。

    【讨论】:

    • 我想明白你告诉我要做什么,但我不知道如何用 hierarcicalDataTemplate 做到这一点。如果我理解正确,我想将 People 属性包装在 CollectionView 中,并在 Collection 更改时刷新 CollectionView。一些示例代码会很有帮助。
    • 感谢您的帮助,我通过将人员列表包装在订阅人员集合更改事件并自行更新的项目的 ObservableCollection 中使其工作。
    猜你喜欢
    • 2021-11-22
    • 2014-02-14
    • 1970-01-01
    • 2011-08-17
    • 2011-07-21
    • 1970-01-01
    • 2021-09-26
    • 2012-06-22
    • 1970-01-01
    相关资源
    最近更新 更多