【问题标题】:Get notified when ObservableCollection is changed当 ObservableCollection 改变时得到通知
【发布时间】:2017-06-14 14:09:50
【问题描述】:

我有一个 ObservableCollection,我想知道何时添加或删除控件。我在网上搜索并尝试了所有这些问题和其他网站,但这些对我一点帮助都没有!

Implementing CollectionChanged

Fire an event when Collection Changed (add or remove)

这是我当前的代码:

public partial class PageView : UserControl
{
    public class PageViewCollection : ObservableCollection<PageViewPage>
    {
        public PageViewPage GetByName()
        {
            PageViewPage pgp = new PageViewPage();

            foreach (PageViewPage page in this)
            {
                if (page.Name == ID)
                {
                    pgp = page;
                }
            }

            return pgp;
        }
    }

    private PageViewCollection pages { get; set; }

    [Bindable(true)]
    [EditorBrowsable(EditorBrowsableState.Always)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    [Browsable(true)]
    [Category("Behavior")]
    public PageViewCollection Pages
    {
        get { return pages; }
        set
        {
            if (pages != value)
            {
                pages = value; this.Invalidate();
                if (PagesChanged != null)
                {
                    PagesChanged(this, EventArgs.Empty);
                }
            }
        }
    }

    [Browsable(true)]
    public event EventHandler PagesChanged;
}

如果我添加一个控件,它仍然不会通知集合已更改。任何帮助表示赞赏。

【问题讨论】:

  • 你试过这个吗:在PageViewCollection类中添加CollectionChanged += new NotifyCollectionChangedEventHandler(PagesChanged);

标签: c# collections controls


【解决方案1】:

你有它倒退。您正在创建一个继承自 ObservableCollection 的 PageViewCollection 对象。可以这样做,但我认为这不是您想要的。

你需要把它变成这样

public ObservableCollection<PageView> PageViews { get; set; }

当您使用 PageViews.Add 或 PageView.Remove 或 .Clear 等时,任何绑定到 PageViews 的东西都会被自动通知。

请记住,这只会通知对象正在从集合中添加/删除/清除的项目,并且如果 PageViews 集合更改为新的 ObservableCollection,则不会更新与其绑定的对象。

为了确保与 PageViews 的绑定始终可靠,您应该使用 INotifyPropertyChanged 或作为 DependencyProperty 将其完全写出来。

public ObservableCollection<PageView> PageViews
{
     get { return pageViews; }
     set 
     {
        pageViews = value;
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(PageViews)));
     }
}

为了帮助理解此 ObservableCollection 公开了 CollectionChanged 事件,当集合被更改时,它会被触发,从而更新与集合的任何绑定。

它还公开了 PropertyChanged 事件,但唯一会触发的属性是 Count 属性。

XAML 中的任何 {Binding} 表达式都会查找这两个事件进行绑定,因此您无需做任何额外的工作。

如果您想在代码中执行此操作,您可以正确地为对象编写一个绑定,该绑定将以正确的方式连接,或者您可以自己作弊并收听 CollectionChanged 事件。

PageViews.CollectionChanged = (s, e) => { ... };

【讨论】:

  • 这无济于事,因为我想将 ObservableCollection 用作一个类,这样我就可以添加自己的方法。
  • 好的,那么同样适用。保留当前的代码并使用 PageViewCollection.Add / Remove / Clear 方法。如果您尝试以编程方式侦听更改并且不想编写适当的绑定机制,那么只需像我提到的那样侦听 CollectionChanged 事件。 PageViewCollection.CollectionChanged += ...
  • 在我看来,您正在监听 PagesChanged 事件。 PagesChanged 事件仅在您分配给您的属性时才会触发......就像( Pages = new PageViewCollection() )监听页面集合的方式将其更改为监听 Co​​llectionChanged 事件。当从集合中添加/删除页面等时会触发。
猜你喜欢
  • 2012-01-19
  • 1970-01-01
  • 2014-07-17
  • 2013-10-20
  • 2017-12-23
  • 1970-01-01
  • 2017-10-18
  • 2022-07-22
  • 2013-01-01
相关资源
最近更新 更多