我正在尝试通过ValueConverter将ObservableCollection<T>绑定到TreeView (或任何其他控件)。在ValueConverter中,我使用AsHierarchy扩展(scip.be)将自引用(每个实体都有一个ParentId字段)转换为层次结构。
如前所述,我将实体(平面列表)存储在ObservableCollection<T>中,当我不使用ValueConverter时,对列表的更新会反映在视图(图形用户界面)上。
如果我添加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}}"我希望有人能提供一个答案,因为这个问题已经困扰我很长一段时间了。
提前谢谢你!
发布于 2011-08-17 04:36:24
以可观察的方式绑定层次结构几乎肯定不会通过一种扩展方法来解决。
我建议您实现自己的实用程序类,类似于CompositeCollection,但当然是针对分层设置,否则如果添加一个项目,重新构建整个树将很快变得不可行。这可能不是一项微不足道的任务,但这是我推荐的大方向。
发布于 2011-08-17 03:46:24
ObservableCollection实现了接口INotifyCollectionChanged,它通知你的itemscontrol有些东西已经改变了。AsHierarchy只返回一个不提供更改通知的IEnumerable,因此您将不再看到更新。
快速而棘手的解决方法是订阅ObservableCollection的CollectionChanged事件。在事件处理程序中,强制重新绑定,以便值转换器的Convert方法再次运行。
https://stackoverflow.com/questions/7083246
复制相似问题