2017-01-29 2 views
1

У меня есть ObservableCollection, и я хочу знать, когда элемент управления добавлен или удален из него. Я искал в Интернете и пробовал все эти вопросы и другие сайты, но это мне совсем не помогло!Получать уведомления, когда 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

пытались ли вы это: В 'классе PageViewCollection' добавить' CollectionChanged + = новый NotifyCollectionChangedEventHandler (PagesChanged); ' – crowchirp

ответ

0

У вас есть это в обратном порядке. Вы создаете объект PageViewCollection, который наследуется от ObservableCollection. Это можно сделать, но я не думаю, что это то, что вы намереваетесь.

Вы должны сделать это как так

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.

Любое выражение {Binding} в XAML будет искать оба этих события для привязки, поэтому вам не нужно выполнять какую-либо дополнительную работу.

Если вы хотите сделать это в коде, вы можете правильно написать привязку к объекту, который правильно подключит устройство, или вы можете просто обмануть и прослушать событие CollectionChanged самостоятельно.

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

Это не поможет, потому что я хочу использовать ObservableCollection как класс, так что я могу добавить свои собственные методы , –

+0

Хорошо, тогда то же самое. Сохраните код в текущий момент и используйте методы PageViewCollection.Add/Remove/Clear. Если вы пытаетесь прослушивать изменения программно и не хотите писать правильный механизм привязки, тогда просто слушайте событие CollectionChanged, как я уже упоминал. PageViewCollection.CollectionChanged + = ... –

+1

Мне кажется, что вы слушаете событие PagesChanged. Событие PagesChanged будет срабатывать только в том случае, если вы назначаете свое свойство ... Like (Pages = new PageViewCollection()) Способ прослушивания коллекции страниц, изменяющих ее для прослушивания события CollectionChanged. Это будет срабатывать при добавлении/удалении страницы из коллекции. –

Смежные вопросы