2009-12-04 23 views
12

El cuadro combinado Wpf permite la edición, y esto está bien si todos los elementos del cuadro combinado son cadenas o tienen un método ToString() definido en ellos .WPF IsEditable = true ComboBox lleno de objetos muestra el ToString() como el elemento seleccionado

Al seleccionar un elemento, se muestra como Texto, no utiliza una plantilla de datos, simplemente llama a ToString() en el elemento que se selecciona.

puedo obtener una lista de artículos en mi combo Desplegar que están formateados usando mi plantilla de elementos, cuando seleccione uno me sale el nombre del objeto, es decir MyNamespace.MyObjectName

Algunas soluciones han sido

  • uso valuePath se una a una propiedad en el objeto, pero si requiere la pantalla sea más de uno de estos , la mala suerte.
  • implementar el método ToString() en el objeto

¿hay otra manera alrededor?

+0

sí, el segundo método funciona perfectamente. –

Respuesta

27

Usted puede hacer esto por completo dentro Xaml

<ComboBox IsTextSearchEnabled="True" IsEditable="True" 
     ItemsSource="{Binding MyObjectCollection}" 
     TextSearch.TextPath="MyObjectName"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding MyObjectName}" /> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

La ventaja es que se puede definir y cambiar esto sin embargo que desee en su XAML sin ningún tipo de código subyacente. Vincula el ItemsSource a su colección de objetos y luego establece la ruta en la que basará su búsqueda en TextSearch.TextPath. Luego, dentro de tu ItemTemplate personalizado, puedes vincular el TextBlock a otra cosa fuera del método ToString del objeto.

+0

Olvidé agregar, la clave aquí es mantener su DataTemplate. La propiedad adjunta TextSearch.TextPath es lo que hace que su cuadro de texto dentro del ComboBox muestre la propiedad que desee. –

+1

oro absoluto. las propiedades adjuntas me atrapan todo el tiempo, porque es muy fácil ignorarlas. Gracias. –

+0

* OMG * Desearía poder votar esto más de una vez. También me hubiera gustado que hubiera aparecido cuando busqué "WPF ComboBox SelectedValuePath ToString" - con suerte, mencionarlos en un comentario ayudará a otros pobres sapos a no perseguir su cola durante 2 horas tratando de resolver esto en el futuro. La mitad de la batalla en el uso de un marco grande es aprender a pensar como las personas que diseñaron el marco (asumiendo que no se puede simplemente memorizar todo el enorme marco ;-)) Definitivamente estaba pensando en este en el "error" "dirección" –

3

Puede usar un IValueConverter para convertir el "objeto" en un valor de cadena y volver. Vea el código de ejemplo en el enlace IValueConverter para más detalles.

+0

gracias por la respuesta, hombre, me siento como un idiota, lo sabía. Lo culpo el viernes. :) –

+0

he usado convertidores muchas veces, ¿dónde pondrías este convertidor, no en la propiedad ItemsSource, he probado la propiedad SelectedItem y el convertidor es golpeado, pero cuando devuelvo una cadena todavía obtengo MyNamespace.MyObjectName, tienes intenté esto con un combobox antes? –

+0

Echa un vistazo al ejemplo en el enlace. Le muestra cómo usar un convertidor con un combobox (a través de los cuadros combinados ItemsTemplate). –

Cuestiones relacionadas