C# WPF将依赖项属性绑定到ObservableCollection

C# WPF将依赖项属性绑定到ObservableCollection,c#,wpf,observablecollection,dependency-properties,C#,Wpf,Observablecollection,Dependency Properties,我有一个具有依赖属性的用户控件: public static readonly DependencyProperty MasterListProperty = DependencyProperty.Register("MasterList", typeof(IEnumerable<MyObject>), typeof(MyControl), new FrameworkPropertyMetadata(null, new PropertyChangedCallback(MasterLi

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

public static readonly DependencyProperty MasterListProperty = DependencyProperty.Register("MasterList", typeof(IEnumerable<MyObject>), typeof(MyControl), new FrameworkPropertyMetadata(null, new PropertyChangedCallback(MasterListChanged)));
我试着把
Mode=TwoWay
放进去,但仍然没有更新我的Dependency属性。我有一个绑定到依赖项属性计数的工具提示,它会被更新,但是我的
MasterListChanged
事件不会被触发

有什么想法吗

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

你不应该这样做。仅当依赖项属性本身设置为新值时,才会调用依赖项属性的
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...
}
但是,当我向根集合添加此依赖项属性绑定到的项时,我没有得到任何更新

你不应该这样做。仅当依赖项属性本身设置为新值时,才会调用依赖项属性的
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...
}


您曾经更改过源列表吗?如果未调用MasterListChanged,那么我认为答案是“否”。当MyObject添加到ObservableCollection时,不会调用PropertyChangedCallback。仅当dependency属性设置为新的IEnumerable(ObservableCollection)时才会调用它。@ASh当我添加项时,我将其添加到SourceList@mm8因此,当我向SourceList添加新项时,仍然没有触发INotifyPropertyChanged事件。是因为我正在绑定到一个完整的ObservableCollection吗?@James,当你向
SourceList
添加一个项目时,
SourceList
引用保持不变,绑定不会检测到任何更改,也不会调用PropertyChangedCallback你曾经更改过
SourceList
?如果未调用MasterListChanged,那么我认为答案是“否”。当MyObject添加到ObservableCollection时,不会调用PropertyChangedCallback。仅当dependency属性设置为新的IEnumerable(ObservableCollection)时才会调用它。@ASh当我添加项时,我将其添加到SourceList@mm8因此,当我向SourceList添加新项时,仍然没有触发INotifyPropertyChanged事件。是因为我绑定到一个完整的ObservableCollection吗?@James,当你向
SourceList
添加一个项目时,
SourceList
引用保持不变,绑定不会检测到任何更改,也不会调用PropertyChangedCallback建议将强制转换语句更改为
e.NewValue as INotifyCollectionChanged
e.OldValue as INotifyCollectionChanged
@sharadaguraj这背后的原因是什么?INotifyCollectionChanged不如observedcollection具体,即,同一代码适用于多个类型。我更新了答案。@James:作为最佳实践,如果您在UI上实现自定义的基于集合的依赖属性,建议您不要将其与特定的项类型(模型)紧密耦合。类似地,我建议您将属性类型从IEnumerable更改为IEnumerable。@Sharadaguraj这意味着我需要在collection changed事件中与之交互的所有属性都必须是静态的?这似乎很疯狂。我这样做是错误的吗?我建议将casting语句更改为
e.NewValue作为INotifyCollectionChanged
e.OldValue作为INotifyCollectionChanged
@sharadaguraj这背后的原因是什么?INotifyCollectionChanged不如observedcollection具体,即,同一代码适用于多个类型。我更新了答案。@James:作为最佳实践,如果您在UI上实现自定义的基于集合的依赖属性,建议您不要将其与特定的项类型(模型)紧密耦合。类似地,我建议您将属性类型从IEnumerable更改为IEnumerable。@Sharadaguraj这意味着我需要在collection changed事件中与之交互的所有属性都必须是静态的?这似乎很疯狂。我走错方向了吗?