Mam więc te klasy, które eksponują kolekcję obiektów podrzędnych.Czy istnieje dobry wzór do ujawnienia kolekcji ogólnej jako readonly?
Nie chcę, aby inne klasy dodawały lub usuwały obiekty z kolekcji, ponieważ muszę je łączyć w zdarzenia w obiektach podrzędnych, tak aby były dodawane lub usuwane. Chcę móc wykonać dodatkowe przetwarzanie. Ale uwielbiam łatwość manipulowania generykami wewnętrznie.
Czy wspomniałem, że jest to aplikacja WPF, więc potrzebuję INotifySupport?
Najlepsze, co mogę wymyślić, to coś takiego.
public class foo : INotifyPropertyChanged
{
protected List<ChildFoo> _Children = new List<ChildFoo>();
public foo()
{
}
public void AddChild(ChildFoo newChild)
{
DoAttachLogic(newChild);
_Children.Add(newChild);
NotifyPropertyChange("Children");
}
public void RemoveChild(ChildFoo oldChild)
{
DoRemoveLogic(oldChild);
_Children.Remove(oldChild);
NotifyPropertyChange("Children");
}
public ChildFoo[] Children
{
get
{
return _Children.ToArray();
}
}
}
Czy istnieją poważne wady tego wzoru, których nie widzę?
Za każdym razem, gdy uzyskuje się dostęp do właściwości Children, otrzymujemy obciążenie związane z przekształcaniem listy w tablicę.
Wszelkie porady na ten temat byłyby świetne.
Nie podnoś wartości NotifyPropertyChange ("Dzieci"), ponieważ obiekt podrzędny został zmieniony. Nie chcesz ponownie wiązać całej kolekcji. –
Zamiast Lista, należy rozważyć ObservableCollection . Implementuje zdarzenia zmiany kolekcji oczekiwane przez usługę WPF. Inną opcją jest bezpośrednie wdrożenie INotifyCollectionChanged. –
Prawo, ale problem z ObservableCollection jest taki, że każdy programista może teraz dodać do kolekcji bezpośrednio, bez użycia metody AddChild(). Gdyby był sposób, aby to zrobić, użyłbym obserwowalnego w mgnieniu oka. –