【问题标题】:WPF Binding Dependency Property to ObservableCollection [duplicate]WPF将依赖属性绑定到ObservableCollection [重复]
【发布时间】:2018-01-23 12:00:21
【问题描述】:

我有一个具有依赖属性的用户控件:

public static readonly DependencyProperty MasterListProperty = DependencyProperty.Register("MasterList", typeof(IEnumerable<MyObject>), typeof(MyControl), new FrameworkPropertyMetadata(null, new PropertyChangedCallback(MasterListChanged)));

我的对象实现了 INotifyPropertyChanged。我正在尝试将此依赖属性绑定到该对象的ObservableCollection。但是,当我将项目添加到此依赖项属性绑定到的根集合中时,我没有得到任何更新。

这是将此依赖项属性绑定到我的集合的控件:

<image:MyControl MasterList="{Binding Path=SourceList, UpdateSourceTrigger=PropertyChanged}"></image:MyControl>

我已尝试输入Mode=TwoWay,但我的 Dependency 属性仍然没有得到任何更新。我有一个绑定到依赖属性计数的工具提示,它会更新,但是我的 MasterListChanged 事件没有被触发。

有什么想法吗?

【问题讨论】:

  • 你有没有换过SourceList?如果没有调用 MasterListChanged,那么我认为答案是“否”
  • 将 MyObject 添加到 ObservableCollection 时不会调用您的 PropertyChangedCallback。只有当依赖属性设置为新的 IEnumerable (ObservableCollection) 时才会调用它。
  • @ASh 添加项目时,我将其添加到 SourceList
  • @mm8 因此,当我向 SourceList 添加新项目时,我仍然没有触发 INotifyPropertyChanged 事件。是因为我绑定到一个完整的 ObservableCollection 吗?
  • @James,当您向SourceList 添加项目时,SourceList 引用保持不变,绑定不会检测到任何更改并且不会调用 PropertyChangedCallback

标签: c# wpf observablecollection dependency-properties


【解决方案1】:

但是,当我将项目添加到此依赖项属性绑定到的根集合中时,我没有得到任何更新。

你不应该这样做。依赖属性的PropertyChangedCallback 仅在依赖属性本身 设置为新值时调用。将MyObject 添加到源集合时不会调用它。

如果您想在添加或删除项目时执行某些操作,您可以为集合处理 CollectionChanged 事件,例如:

private static void MasterListChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var newCol = e.NewValue as INotifyCollectionChanged;
    if (newCol != null)
    {
        newCol.CollectionChanged += Coll_CollectionChanged;
    }

    var oldCol = e.OldValue as INotifyCollectionChanged;
    if (oldCol != null)
    {
        oldCol.CollectionChanged -= Coll_CollectionChanged;
    }
}

private static void Coll_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
    //do something...
}

【讨论】:

  • 建议将强制转换语句更改为 e.NewValue as INotifyCollectionChangede.OldValue as INotifyCollectionChanged
  • @SharadaGururaj 背后的原因是什么?
  • INotifyCollectionChanged 不如 ObservableCollection 具体,即相同的代码适用于不止一种类型。我更新了答案。
  • @James:作为最佳实践,如果您在 UI 上实现基于自定义集合的依赖属性 - 建议您不要将其与特定的项目类型(模型)紧密耦合。同样,我建议您将属性类型从 IEnumerable 更改为 IEnumerable。
  • @SharadaGururaj 所以这意味着我需要在集合更改事件中与之交互的所有属性都必须是静态的?这似乎很疯狂。我是不是走错路了?
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 2012-11-08
  • 2017-07-19
  • 2020-12-22
  • 2014-08-31
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多