【问题标题】:Binding to an ObservableCollection<T> and using a ValueConverter绑定到 ObservableCollection<T> 并使用 ValueConverter
【发布时间】:2011-08-16 18:37:00
【问题描述】:

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

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

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

提前谢谢你!

【问题讨论】:

  • 请将 XAML 发布到您附加值转换器的位置。

标签: c# wpf xaml data-binding observablecollection


【解决方案1】:

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

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

【讨论】:

  • 谢谢 - 我很害怕。
  • 很抱歉打扰您了。 - 但你可能知道一个教程吗?通过实现 ICollection、INotifyCollectionChanged、INotifyPropertyChanged 接口来创建自定义 ObservableCollection,我走在了正确的轨道上?
  • @Dänu:对不起,我不知道这方面的任何教程,如果您不想完全重新实现这些东西,您可以在内部使用 ObservableCollections 并转发相关方法。如果我有时间,我可能会真正尝试一下......
  • 谢谢,我会继续这个,并尝试将装饰器模式与内部可观察集合一起使用。但是现在,我真的要睡觉了……
【解决方案2】:

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

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

【讨论】:

  • 这有点太脏了 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 2017-10-16
  • 2017-02-08
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多