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事件中与之交互的所有属性都必须是静态的?这似乎很疯狂。我走错方向了吗?