2010-05-01 11 views
7

Estoy construyendo un control WPF personalizado que se deriva de TabControl. En ControlTemplate, estoy usando ItemsControl para mostrar una lista que está siendo vinculada desde la plantilla (una colección observable de tipo FileMenuItem). Durante la ejecución del programa, estoy recibiendo el siguiente error en la ventana de salida:WPF Custom Control - ItemsControl plantilla no se aplica

ItemTemplate y ItemTemplateSelector se ignoran para los artículos de tipo de contenedor ya la de ItemsControl; Tipo = 'FileMenuItem'

El tipo FileMenuItem se deriva de MenuItem. Si cambio la clase base a DependencyObject, el código realmente se ejecuta y se aplica la plantilla (entonces esa es una opción). Busqué en Google el error y no pude encontrar nada al respecto, ¿alguien se ha topado con esto mientras desarrollaba controles personalizados? Aunque tengo una solución alternativa, me gustaría entender qué está pasando, y creo que usar MenuItem como clase base es una implementación más limpia.

Puedo publicar más código si me ayudaría. ¡Gracias!

Respuesta

6

El propósito de un DataTemplate (como ItemTemplate) es proporcionar una visualización para un objeto de datos. Específicamente, define un conjunto de elementos para agregar al árbol visual en lugar de los datos proporcionados a un ContentPresenter o ItemsPresenter. En su caso, su lista fuente es una colección de objetos que ya se pueden agregar directamente al árbol visual para mostrarlos en la interfaz de usuario.

Puede ver esto en el siguiente ejemplo simplificado donde solo "Tres" aparece en rojo porque los dos primeros elementos se definen en un formulario que puede mostrar directamente ComboBox.

<ComboBox> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding}" Foreground="Red"/> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
    <ComboBoxItem>One</ComboBoxItem> 
    <ComboBoxItem>Two</ComboBoxItem> 
    <sys:String>Three</sys:String> 
</ComboBox> 
+1

Ok, creo que entiendo - es así, es posible soportar este escenario, o tengo que cambiar a heredar de una clase base diferente? ¡Gracias por tu ayuda! –

+5

Hay muchas formas diferentes de ir. Debería intentar decidir si desea tratar los elementos de la colección como controles (derivados de UIElement) o datos (INotifyPropertyChanged u DependencyObject) o crear una clase de datos y un control de UI o DataTemplate. Otra opción posible es un ItemsControl derivado que anula GetContainerForItemOverride y IsItemItsOwnContainerOverride para usar un contenedor FileMenuItem para cada elemento (ComboBox, ListBox, etc.). –

+5

Uno de los métodos más simples (y efectivos) para resolver este problema ha sido siempre derivar tu propio ItemsControl, y anular el método 'IsItemItsOwnContainerOverride' para devolver falso, lo que significa que el DataTemplate no se saltará debido al problema John explicado. – GEEF

Cuestiones relacionadas