我有一个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;
}
如果我添加一个控件,它仍然不会通知该集合已更改。任何帮助表示赞赏。
答案 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) => { ... };