我正在尝试实现一个可绑定的集合 - 一个专门的堆栈 - 它需要显示在我的 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(页面的Calculator属性),然后绑定到一个GridView:
<GridView x:Name="StackGrid" ItemsSource="{Binding Stack, Mode=OneWay}" ItemContainerStyle="{StaticResource StackTileStyle}" SelectionMode="None">
... ItemTemplate omitted for length ...
绑定最初在页面导航到时起作用 - 堆栈中的现有项目显示得很好,但是添加到堆栈中/从堆栈中删除的项目不会反映在 GridView 中,直到页面被导航离开和返回。调试显示 Stack 中的 CollectionChanged 事件始终为空,因此它永远不会在更新时被调用。
我错过了什么?