/ / Establecer TextSearch.Text para WPF-ComboBoxItem a través de DataTemplate - c #, wpf, enlace de datos, cuadro combinado, placa de datos

Establezca TextSearch.Text para WPF-ComboBoxItem a través de DataTemplate - c #, wpf, enlace de datos, cuadro combinado, placa de datos

Utilizo una placa de datos para visualizar algunos elementos en un ComboBox, ItemsSource está vinculado a un ObservableCollection. Para mantenerlo simple, digamos que puse personas en la colección Observable:

public class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
}

Mi DataTemplate tiene este aspecto:

<DataTemplate TargetType="{x:Type Person}">
<StackPanel Orientation="Horizontal">
<TextSearch.Text>
<MultiBinding StringFormat="{} {0} {1}">
<Binding Path="FirstName"/>
<Binding Path="LastName"/>
</MultiBinding>
</TextSearch.Text>
<TextBlock Text="{Binding FirstName}" Margin="2,0" />
<TextBlock Text="{Binding LastName}"/>
</StackPanel>
</DataTemplate>

Ahora quiero habilitar autocompletar por completonombres en el ComboBox sin introducir una tercera propiedad en mi clase de persona. Por lo tanto, no quiero usar la propiedad TextSearch.TextPath en el ComboBox, sino que me gustaría enlazar la propiedad TextSearch.Text de cada ComboBoxItem en la DataTemplate. Desafortunadamente, cuando hago esto (que funciona con un MultiBinding y StringFormat, probado con Snoop), el valor enlazado se registra solo para mi StackPanel, pero al usar Snoop (gran herramienta) encontré que este panel de pila sirve solo como contenido para algunos ComboBoxItemTemplate , que pone otro borde, etc. y finalmente una etiqueta ComboBoxItem alrededor de mi StackPanel exterior. Por lo tanto, la configuración TextSearch.Text no es efectiva, ya que debe establecerse en el ComboBoxItem creado, y no en algún lugar dentro.

Pregunta ahora: ¿Cómo puedo propagar este TextSearch.¿La propiedad de texto de mi plantilla de datos al ComboBoxItem circundante solo utiliza los estilos XAML y las plantillas de control? La solución puede modificar las Plantillas de control predeterminadas de ComboBox y ComboBoxItem y mi Plantilla de datos personalizada (Elemento), pero no usar ningún Código detrás, o al menos no demasiado. Tal vez un comportamiento adjunto también estaría bien. Pero estoy casi seguro de que debe haber una manera de hacerlo funcionar sin, TemplateBinding o RelativeSource-stuff ... Y, por supuesto, la solución debe hacer que mi selección de teclado y la terminación de texto funcionen, s.th. cuando la lista contiene Hans Josef y Hans Peter, al ingresar "Hans" se debe sugerir automáticamente a Hans Josef, mientras que al ingresar a "Hans P" lo suficientemente rápido se debe sugerir a Hans Peter.

¿Alguna solución?

Respuestas

1 para la respuesta № 1

Lo que rodea a tu panel es el predeterminadoenvase. Debe aplicar la propiedad TextSearch.Text al contenedor. Debería poder hacer esto configurando la propiedad a través del ItemContainerStyle de la siguiente manera:

<ComboBox.ItemContainerStyle>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="TextSearch.Text">
<Setter.Value>
<MultiBinding StringFormat="{} {0} {1}">
<Binding Path="FirstName"/>
<Binding Path="LastName"/>
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</ComboBox.ItemContainerStyle>

8 para la respuesta № 2

Respuesta corta: lo que quiere hacer no se puede hacer directamente en XAML, pero hay otras formas de hacerlo.

Respuesta larga: ComboBox busca la propiedad TextSearch.Text directamente en los elementos de datos almacenados en la colección Items o ItemsSource. Por lo tanto, no puede establecer la propiedad en la plantilla de datos o el estilo porque se aplican a los objetos utilizados para mostrar los elementos de datos, y no a los elementos de datos en sí.

En particular, si nos fijamos en los ejemplos de la Clase de búsqueda de texto página, verás que adjuntan laPropiedad TextSearch.Text para los objetos de imagen que entran en la colección ComboBox.Items. Puedes hacer esto en tu programa haciendo de Person un objeto Dependency, pero no creo que quieras establecer la propiedad en cada objeto como ese.

Tienes varias opciones aquí:

Si puede modificar la clase Persona, puededefina el método ToString () para devolver el texto a autocompletar o defina una propiedad arbitraria como Fullname y establezca Textsearch.TextPath en el ComboBox. Por ejemplo:

public class Person
{
string FirstName { get; set; }
string LastName {get; set; }
string FullName { get { return String.Format("{0} {1}", FirstName, LastName); } }
}

y

<ComboBox TextSearch.TextPath="FullName" ItemsSource="collectionOfPersons"/>

Alternativamente, si no quiere tocar Persona, puede crear una clase de contenedor que exponga estas propiedades.