绑定到ObservableCollection <t>并使用ValueConverter </t>

时间:2011-08-16 18:37:00

标签: c# wpf xaml data-binding observablecollection

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

如上所述,我将我的(平面列表)实体存储在ObservableCollection<T>内,当我不使用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();
    }
}

我绑定转换器的ItemsSource:

ItemsSource="{Binding Data,
                      Source={StaticResource MyDataSource},
                      Converter={StaticResource HierarchyValueConverter}}"

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

提前谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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