Xaml行为DP未更新

时间:2016-09-22 13:31:37

标签: xaml uwp behavior

我有一个使用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只是检查对象是否已经改变,如果一个项目发生了变化,它会认为该集合根本没有改变吗?这是真的,如果是的话,我怎么能克服这个?

由于

1 个答案:

答案 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
    }
}