我正在尝试通过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}}"
我希望有人可以提供答案,因为这个问题已经困扰了我很长一段时间了。
提前谢谢!
答案 0 :(得分:1)
以可观察的方式绑定层次结构几乎肯定不会通过一种扩展方法解决。
我建议您实现自己的实用程序类,类似CompositeCollection
,但当然是针对分层设置,如果添加一个项目则重建整个树将很快变得不可行。这可能不是一项微不足道的任务,但这是我建议的总体方向。
答案 1 :(得分:0)
ObservableCollection实现了接口INotifyCollectionChanged,它通知你的itemscontrol某些内容已经发生了变化。 AsHierarchy只返回一个IEnumerable,它不提供更改通知,因此您将不再看到更新。
快速而又脏的修复是订阅ObservableCollection的CollectionChanged事件。在事件处理程序中,强制重新绑定,以便值转换器的Convert方法再次运行。