gpt4 book ai didi

data-binding - INotifyCollectionChanged 不足以更新数据绑定(bind)控件?

转载 作者:行者123 更新时间:2023-12-02 14:24:33 24 4
gpt4 key购买 nike

我正在尝试实现一个可绑定(bind)集合(一个专门的堆栈),它需要显示在我的 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 属性),然后绑定(bind)到 GridView:

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

... ItemTemplate omitted for length ...

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

我错过了什么?

最佳答案

现在我在自定义集合中遇到了同样的问题,我希望它是可绑定(bind)的。我发现只有从 Collection<> 派生的类可以绑定(bind)到。

为什么?现在我不知道。因此,如果您确实希望它起作用,请派生形式 Collection<>但这会扰乱你的设计。

关于data-binding - INotifyCollectionChanged 不足以更新数据绑定(bind)控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15044458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com