Xaml行为DP未更新

Xaml行为DP未更新,xaml,uwp,behavior,Xaml,Uwp,Behavior,我有一个UWP应用程序,它使用托管UWP行为SDK。 我编写了一个自定义行为,它有两个依赖属性,其中一个是ObservableCollection 每当我更新集合中的项目时,我都会确保为集合调用PropertyChanged 但是,未更新依赖项属性 我的代码: <trigger:CustomBehavior ItemIndex="{x:Bind ItemIndex}" Presences="{Binding ElementName=Box, Path=DataC

我有一个UWP应用程序,它使用托管UWP行为SDK。 我编写了一个自定义行为,它有两个依赖属性,其中一个是ObservableCollection

每当我更新集合中的项目时,我都会确保为集合调用PropertyChanged

但是,未更新依赖项属性

我的代码:

<trigger:CustomBehavior ItemIndex="{x:Bind ItemIndex}"
     Presences="{Binding ElementName=Box,
         Path=DataContext.CustomCollection,
             UpdateSourceTrigger=PropertyChanged, Converter={StaticResource TestConverter}}" />

我的TestConverter告诉我,当我更新集合中的项目时,updatesource触发器正在工作。但是,我的行为中的dependency属性没有触发已更改的事件。当我更改整个自定义集合时,DP会更新,而当我只更改一项时,DP不会更新

到目前为止的研究表明DependencyObject.SetValue只是检查对象是否发生了更改,如果有一项发生了更改,它会认为集合根本没有更改?这是真的吗?如果是,我该如何克服


感谢

集合类型依赖属性通常应声明为最基本的集合类型,
IEnumerable
。通过这种方式,您可以为属性分配各种实际的集合类型,包括那些实现
INotifyCollectionChanged
的集合类型,如
observetecollection

您将在运行时检查集合类型是否实际实现了接口,并可能为
CollectionChanged
事件附加和分离处理程序方法。

公共类CustomBehavior:。。。
{
公共静态只读依赖项属性存在属性=
从属属性。寄存器(
“存在”、类型(IEnumerable)、类型(CustomBehavior),
新属性元数据(空,
(o,e)=>((CustomBehavior)o.OnPresencesPropertyChanged(e));
私有void on presence属性更改(DependencyPropertyChangedEventArgs e)
{
var oldCollectionChanged=e.OldValue作为INotifyCollectionChanged;
var newCollectionChanged=e.NewValue作为INotifyCollectionChanged;
如果(oldCollectionChanged!=null)
{
oldCollectionChanged.CollectionChanged-=OnPresencesCollectionChanged;
}
if(newCollectionChanged!=null)
{
newCollectionChanged.CollectionChanged+=OnPresencesCollectionChanged;
//除了添加CollectionChanged处理程序外,任何
//已经存在的集合元素应该在这里处理
}
}
存在时私有无效集合已更改(
对象发送方,NotifyCollectionChangedEventArgs(e)
{
//在此处处理集合更改
}
}

集合类型依赖属性通常应声明为最基本的集合类型,
IEnumerable
。通过这种方式,您可以为属性分配各种实际的集合类型,包括那些实现
INotifyCollectionChanged
的集合类型,如
observetecollection

您将在运行时检查集合类型是否实际实现了接口,并可能为
CollectionChanged
事件附加和分离处理程序方法。

公共类CustomBehavior:。。。
{
公共静态只读依赖项属性存在属性=
从属属性。寄存器(
“存在”、类型(IEnumerable)、类型(CustomBehavior),
新属性元数据(空,
(o,e)=>((CustomBehavior)o.OnPresencesPropertyChanged(e));
私有void on presence属性更改(DependencyPropertyChangedEventArgs e)
{
var oldCollectionChanged=e.OldValue作为INotifyCollectionChanged;
var newCollectionChanged=e.NewValue作为INotifyCollectionChanged;
如果(oldCollectionChanged!=null)
{
oldCollectionChanged.CollectionChanged-=OnPresencesCollectionChanged;
}
if(newCollectionChanged!=null)
{
newCollectionChanged.CollectionChanged+=OnPresencesCollectionChanged;
//除了添加CollectionChanged处理程序外,任何
//已经存在的集合元素应该在这里处理
}
}
存在时私有无效集合已更改(
对象发送方,NotifyCollectionChangedEventArgs(e)
{
//在此处处理集合更改
}
}

首先要注意:“当我更新集合中的项目时,updatesource触发器正在工作”是一个常见的误解。在单向绑定上设置
UpdateSourceTrigger=PropertyChanged
无效,它仅控制在目标更改时如何更新绑定源,即仅在双向或单向源绑定中有效。也就是说,更新集合中的项目,然后引发PropertyChanged事件也没有效果,因为集合实例没有更改,PropertyChanged事件会被静默忽略。或者替换整个集合,或者在Presences property.com的PropertyChangedCallback中注册
INotifyCollectionChanged.CollectionChanged
事件的处理程序。你能把这个作为一个答案,这样我就可以接受了吗?首先要注意:“当我更新集合中的一个项目时,updatesource触发器正在工作”是一个常见的误解。在单向绑定上设置
UpdateSourceTrigger=PropertyChanged
无效,它仅控制在目标更改时如何更新绑定源,即仅在双向或单向源绑定中有效。也就是说,更新集合中的项目,然后引发PropertyChanged事件也没有效果,因为集合实例没有更改,PropertyChanged事件会被静默忽略。或者替换整个集合,或者在Presences property.com的PropertyChangedCallback中注册
INotifyCollectionChanged.CollectionChanged
事件的处理程序。你能把这个作为答案贴出来让我接受吗?