Buduję niestandardowy formant WPF, który wywodzi się z TabControl. W ControlTemplate używam ItemsControl, aby wyświetlić listę, która jest związana z szablonem (obserwowalna kolekcja typu FileMenuItem). Podczas wykonywania programu, otrzymuję następujący błąd w oknie wyjściowym:Niestandardowe sterowanie WPF - szablon ItemsControl nie jest stosowany
ItemTemplate i ItemTemplateSelector są ignorowane przedmiotów już Spośród ItemsControl typ kontenera; Typ = 'FileMenuItem'
Typ FileMenuItem pochodzi z MenuItem. Jeśli zmienię klasę podstawową na DependencyObject, kod faktycznie działa i szablon zostanie zastosowany (więc jest to opcja). Przeszukałem ten błąd i nie mogłem znaleźć nic na ten temat, czy ktokolwiek wpadł na to podczas opracowywania niestandardowych elementów sterujących? Chociaż mam obejście, chciałbym zrozumieć, co się dzieje, i myślę, że używanie MenuItem jako klasy bazowej jest czystszą implementacją.
Mogę opublikować więcej kodu, jeśli mogłoby to pomóc. Dzięki!
OK, myślę, że rozumiem - czy możliwe jest wsparcie tego scenariusza, czy muszę przełączyć się na dziedziczenie z innej klasy bazowej? Dzięki za pomoc! –
Istnieje wiele różnych sposobów, w jakie możesz pójść. Powinieneś podjąć decyzję, czy chcesz traktować elementy kolekcji jako kontrole (pochodzące z UIElement) lub dane (INotifyPropertyChanged lub DependencyObject), czy też utworzyć zarówno klasę danych, jak i kontrolkę interfejsu użytkownika lub DataTemplate. Inną możliwą opcją jest wyprowadzona ItemsControl, która zastępuje GetContainerForItemOverride i IsItemItsOwnContainerOverride w celu użycia kontenera FileMenuItem dla każdego elementu (ComboBox, ListBox, itp.). –
Jednym z najprostszych (i skutecznych) sposobów rozwiązania tego problemu był dla mnie zawsze wyprowadzenie własnego ItemsControl i nadpisanie metody 'IsItemItsOwnContainerOverride' w celu zwrócenia false, co oznacza, że DataTemplate nie zostanie pominięty z powodu problemu z Johnem wyjaśnione. – GEEF