首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绑定到ObservableCollection<T>并使用ValueConverter

绑定到ObservableCollection<T>并使用ValueConverter
EN

Stack Overflow用户
提问于 2011-08-17 02:37:00
回答 2查看 422关注 0票数 0

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

如前所述,我将实体(平面列表)存储在ObservableCollection<T>中,当我不使用ValueConverter时,对列表的更新会反映在视图(图形用户界面)上。

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

ValueConverter源码:

代码语言:javascript
复制
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();
    }
}

绑定转换器的ItemsSource:

代码语言:javascript
复制
ItemsSource="{Binding Data,
                      Source={StaticResource MyDataSource},
                      Converter={StaticResource HierarchyValueConverter}}"

我希望有人能提供一个答案,因为这个问题已经困扰我很长一段时间了。

提前谢谢你!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-17 04:36:24

以可观察的方式绑定层次结构几乎肯定不会通过一种扩展方法来解决。

我建议您实现自己的实用程序类,类似于CompositeCollection,但当然是针对分层设置,否则如果添加一个项目,重新构建整个树将很快变得不可行。这可能不是一项微不足道的任务,但这是我推荐的大方向。

票数 1
EN

Stack Overflow用户

发布于 2011-08-17 03:46:24

ObservableCollection实现了接口INotifyCollectionChanged,它通知你的itemscontrol有些东西已经改变了。AsHierarchy只返回一个不提供更改通知的IEnumerable,因此您将不再看到更新。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7083246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档