我有一个使用Managed UWP Behavior SDK的UWP应用程序。 我写了一个自定义行为,它有两个依赖属性,其中一个是ObservableCollection。
每当我更新集合中的项目时,我都会确保为集合调用PropertyChanged。
但是,Dependency属性未更新。
我的代码:
<trigger:CustomBehavior ItemIndex="{x:Bind ItemIndex}"
Presences="{Binding ElementName=Box,
Path=DataContext.CustomCollection,
UpdateSourceTrigger=PropertyChanged, Converter={StaticResource TestConverter}}" />
我的TestConverter告诉我,当我更新集合中的项目时,updatesource触发器正在工作。但是,我的行为中的依赖项属性未触发Changed事件。当我更改整个自定义集合时,DP会更新,当我只更改一个项目时,它不是。
到目前为止的研究表明,DependencyObject.SetValue只是检查对象是否已经改变,如果一个项目发生了变化,它会认为该集合根本没有改变吗?这是真的,如果是的话,我怎么能克服这个?
由于
答案 0 :(得分:2)
通常应将集合类型依赖项属性声明为最基本的集合类型IEnumerable
。这样,您可以为属性分配各种实际的集合类型,包括实现INotifyCollectionChanged
的那些类型,例如ObservableCollection<T>
。
您可以在运行时检查集合类型是否实际实现了接口,并且可能附加和分离CollectionChanged
事件的处理程序方法。
public class CustomBehavior : ...
{
public static readonly DependencyProperty PresencesProperty =
DependencyProperty.Register(
"Presences", typeof(IEnumerable), typeof(CustomBehavior),
new PropertyMetadata(null,
(o, e) => ((CustomBehavior)o).OnPresencesPropertyChanged(e)));
private void OnPresencesPropertyChanged(DependencyPropertyChangedEventArgs e)
{
var oldCollectionChanged = e.OldValue as INotifyCollectionChanged;
var newCollectionChanged = e.NewValue as INotifyCollectionChanged;
if (oldCollectionChanged != null)
{
oldCollectionChanged.CollectionChanged -= OnPresencesCollectionChanged;
}
if (newCollectionChanged != null)
{
newCollectionChanged.CollectionChanged += OnPresencesCollectionChanged;
// in addition to adding a CollectionChanged handler, any
// already existing collection elements should be processed here
}
}
private void OnPresencesCollectionChanged(
object sender, NotifyCollectionChangedEventArgs e)
{
// handle collection changes here
}
}