繁体   English   中英

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

[英]Binding to an ObservableCollection<T> and using a ValueConverter

我正在尝试通过ValueConverterObservableCollection<T>绑定到TreeView (或任何其他控件)。 在 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}}"

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

先感谢您!

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM