una selección opciones múltiple lista desplegable dependiente cuadro crear como combinado .net wpf silverlight xaml combobox

.net - selección - ¿Cómo usar una plantilla diferente para los estados seleccionados y desplegables en el cuadro combinado en Silverlight?



lista desplegable html y php (3)

Puede lograr esto solo con ItemsContainerStyle. Agregue su TextBlock e Image en lugar de ContentPresenter. Agregue VisualStateManager y active Visibilidad del control de imagen según el estado seleccionado de VSM.

Parece que no puedo configurar ContentTemplate para ComboBoxItem. La razón por la que trato de hacer esto es que quiero tener 2 apariciones para mis datos en el cuadro combinado. Cuando el cuadro combinado está abierto (el menú está desactivado), quiero un cuadro de texto (con el nombre de la imagen) y un control de imagen debajo. Cuando selecciono el elemento, quiero que el cuadro combinado muestre un cuadro de texto con el nombre de la imagen.

Pensé que podría lograr esto modificando ItemTemplate y ItemContainerStyle del ComboBox. ItemContainerStyle contiene el siguiente ContentPresenter:

<ContentPresenter HorizontalAlignment="Left" Margin="{TemplateBinding Padding}" x:Name="contentPresenter" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>

Así que asumí que podía simplemente configurar ContentTemplate aquí y que funcionaría. Pero parece que no puedo hacer que funcione:

<DataTemplate x:Key="ComboBoxDataTemplate"> <Grid> <TextBlock Text="{Binding Path=''Name''}"/> </Grid> </DataTemplate> <DataTemplate x:Key="ComboBoxItemTemplate"> <StackPanel> <TextBlock Text="{Binding Path=''Name''}"/> <Image Source="{Binding Path=''Source''}" Width="64" Height="64"/> </StackPanel> </DataTemplate> <Style x:Key="ComboBoxItemStyle1" TargetType="ComboBoxItem"> ... <Setter Property="ContentTemplate" Value="{StaticResource ComboBoxItemTemplate}"/> ...

Aquí está mi cuadro combinado:

<ComboBox Width="70" Margin="3,0,0,0" ItemsSource="{StaticResource Source}" ItemTemplate="{StaticResource ComboBoxDataTemplate}" ItemContainerStyle="{StaticResource ComboBoxItemStyle1}" />

La única forma en que puedo hacer que esto funcione es eliminar ContentPresenter de ItemContainerStyle y reemplazarlo con el contenido de mi plantilla personalizada (ComboBoxItemTemplate). Pero no pensé que debería usar este enfoque, ya que significaría que el ContentPresenter ya no existe (y el código en el ComboBox podría depender de que exista).

¡Cualquier ayuda para mostrar un cuadro combinado con un menú desplegable diferente y una plantilla seleccionada sería muy apreciada!


DataTemplate es principalmente para su visualización de datos. Es mejor proporcionar todas las dinámicas relacionadas con la interfaz de usuario dentro de ControlTemplate (comportamientos de control). No hay un problema potencial si no tienes un ContentPresenter. El único problema es que si desea reutilizar este ControlTemplate desde algún otro ComboBox. Luego puede declarar allí otra plantilla de Control limpia con un ContentPresenter.


ComboBox.ItemTemplate es solo una forma conveniente de establecer ComboBoxItem.ContentTemplate. Así que su código anterior básicamente intenta establecer el ComboBoxItem.ContentTemplate dos veces.

Como señaló Jobi, podrías intentar usar solo un Estilo personalizado. Puede excluir de manera segura el ContentPresenter, si siempre conoce el tipo del Contenido. El ContentPresenter solo le permite usar un DataTemplate para mostrar algunos datos aleatorios. Pero podrías reemplazarlo con un TextBlock y una imagen. Simplemente pierde la capacidad de especificar un DataTemplate.

El problema con el enfoque de Jobi es que el elemento seleccionado no mostrará su imagen, incluso si está en el menú desplegable. Realmente, el elemento seleccionado se muestra en dos ubicaciones (el menú desplegable y el cuerpo principal del ComboBox). En un lugar, quiere un DataTemplate, y desea un DataTemplate diferente en el otro.

Su mejor opción es cambiar el estilo del ComboBox. Puede obtener el Estilo predeterminado desde aquí . Hay un ContentPresenter con el nombre "ContentPresenter". Necesitarías:

  1. Elimine / cambie el nombre de ContentPresenter, de modo que ComboBox no establecerá automáticamente las propiedades Content / ContentTemplate
  2. Enlace la propiedad ContentPresenter.Content de la siguiente manera: "{TemplateBinding SelectedObject}"
  3. Establezca la propiedad ContentPresenter.ContentTemplate en su DataTemplate sin la Imagen
  4. Establezca la propiedad ComboBox.ItemTemplate en DataTemplate con una imagen y un TextBlock como si fuera
  5. Dale al ComboBox Style una clave explícita, como x: Key = "MyComboBoxStyle"
  6. Usa el estilo en tu ComboBox, como Style = "{StaticResource MyComboBoxStyle}"

Esto efectivamente ignora el ComboBoxItem.ContentTemplate cuando muestra el elemento seleccionado en el cuerpo del ComboBox, pero lo usa cuando muestra el ComboBoxItem en el menú desplegable.