更改ObservableCollection时收到通知

时间:2017-01-29 07:32:46

标签: c# collections controls

我有一个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;
}

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

1 个答案:

答案 0 :(得分:0)

你倒退了。您正在创建一个继承自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) => { ... };