INotifyCollectionChanged不足以进行数据绑定控制更新?

时间:2013-02-23 19:09:53

标签: data-binding windows-8 windows-runtime windows-store-apps inotifycollectionchanged

我正在尝试实现一个可绑定的集合 - 一个专门的堆栈 - 需要在我的Windows 8应用程序的一个页面上显示,以及在它们发生时对其进行的任何更新。为此,我实现了INotifyCollectionChanged和IEnumerable<>:

public class Stack : INotifyCollectionChanged, IEnumerable<Number>
{

...

public void Push(Number push)
{
    lock (this)
    {
        this.impl.Add(push);
    }

    if (this.CollectionChanged != null)
        this.CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, push));
}

...and the equivalents for other methods...

#region INotifyCollectionChanged implementation

public event NotifyCollectionChangedEventHandler CollectionChanged;

#endregion

public IEnumerator<Number> GetEnumerator()
{
    List<Number> copy;

    lock (this)
    {
        copy = new List<Number>(impl);
    }
    copy.Reverse();

    foreach (Number num in copy)
    {
        yield return num;
    }
}

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
    return this.GetEnumerator();
}

此集合类用于定义页面拥有的基础类实例的属性,该属性设置为其DataContext(Page的Calculator属性),然后绑定到GridView:

<GridView x:Name="StackGrid" ItemsSource="{Binding Stack, Mode=OneWay}" ItemContainerStyle="{StaticResource StackTileStyle}" SelectionMode="None">

... ItemTemplate omitted for length ...

绑定最初在页面导航时起作用 - 堆栈中的现有项目显示得很好,但添加到堆栈中/从堆栈中删除的项目不会反映在GridView中,直到页面导航离开和返回。调试显示Stack中的CollectionChanged事件始终为null,因此在更新时永远不会调用它。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

刚才我正面临着我想要绑定的自定义集合的同样问题。我发现只有从Collection<>派生的类才能被绑定。

为什么呢?现在我不知道。因此,如果您真的希望它能够工作,那么派生形式Collection<>,但这会弄乱您的设计。