C# 绑定到可观察集合<;T>;以及使用值转换器

C# 绑定到可观察集合<;T>;以及使用值转换器,c#,wpf,xaml,data-binding,observablecollection,C#,Wpf,Xaml,Data Binding,Observablecollection,我正试图通过ValueConverter将observeCollection绑定到TreeView(或任何其他控件)。在ValueConverter中,我使用扩展()将自引用(每个实体都有一个ParentId字段)转换为层次结构 如前所述,我将实体(平面列表)存储在ObservableCollection中,当我不使用ValueConverter时,列表的更新会反映在视图(GUI)中 如果添加ValueConverter,更新将不再反映在视图上,如果在值转换器内设置断点,我会注意到它只在加载时调

我正试图通过
ValueConverter
observeCollection
绑定到
TreeView
(或任何其他控件)。在ValueConverter中,我使用扩展()将自引用(每个实体都有一个ParentId字段)转换为层次结构

如前所述,我将实体(平面列表)存储在
ObservableCollection
中,当我不使用ValueConverter时,列表的更新会反映在视图(GUI)中

如果添加
ValueConverter
,更新将不再反映在视图上,如果在值转换器内设置断点,我会注意到它只在加载时调用一次,忽略所有进一步的CollectionChanged事件

ValueConverter的源代码:

public class HierarchyValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) return null;
        ObservableCollection<Entity> data = (ObservableCollection<Entity>)value;
        return data.AsHierarchy(p => p.Id, p => p.ParentId);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
我希望有人能提供一个答案,因为这个问题困扰了我很长一段时间


提前谢谢你

ObservableCollection实现接口INotifyCollectionChanged,该接口通知itemscontrol某些内容已更改。AsHierarchy只返回一个IEnumerable,它不提供更改通知,因此您将不再看到更新


快速而肮脏的修复方法是订阅ObservableCollection的CollectionChanged事件。在事件处理程序中,强制重新绑定,以便值转换器的Convert方法再次运行。

以可观察的方式绑定层次结构几乎肯定不会由一个扩展方法解决


我建议您实现自己的实用程序类,类似于
CompositeCollection
,但当然是针对层次结构设置,如果添加了一个项,则重建整个树将很快变得不可行。这可能不是一项简单的任务,但这是我推荐的一般方向。

请在附加值转换器的XAML上发布。这有点太脏;-)谢谢-我很害怕。很抱歉打扰你H.B。-但是你可以知道一个教程吗?通过实现接口ICollection、INotifyCollectionChanged、INotifyPropertyChanged,我创建了一个定制的ObservableCollection,这是正确的做法?@Dänu:对不起,我不知道这方面的任何教程,如果您不想完全重新实现这些东西,您可以在内部使用ObservableCollections并转发相关方法。如果我有时间的话,我可能真的会尝试一下……谢谢,我会继续这样做,并尝试在内部可观察的集合中使用decorator模式。但现在,我真的要睡觉了。。。