2011-02-10 8 views
10

PersonVM.csWPF: al cambiar una ItemTemplate de ComboBox se elimina la capacidad de saltar la lista mientras escribe. Cualquier forma de arreglar esto?

public class MainWindowVM 
{ 
    public MainWindowVM() 
    { 
     PersonList = new ObservableCollection<Person>(Employees); 
    } 

    private Person[] Employees = new Person[] 
    { 
     new Person { ID = 1, Name = "Adam" }, 
     new Person { ID = 2, Name = "Bill" }, 
     new Person { ID = 10, Name = "Charlie" }, 
     new Person { ID = 15, Name = "Donna" }, 
     new Person { ID = 20, Name = "Edward" } 
    }; 

    public ObservableCollection<Person> PersonList { get; set; } 
} 

Person.cs

public class Person 
{ 
    public string Name { get; set; } 
    public int ID { get; set; } 
} 

MainWindow.xaml (versión de trabajo Funcionalmente - No es lo que quiero mostrar)

<Window x:Class="TestApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <ComboBox Height="23" Width="300" 
        ItemsSource="{Binding Path=Objects}" 
        DisplayMemberPath="Name" 
        > 
     </ComboBox> 
    </Grid> 
</Window> 

MainWindow.x AML ( muestra correctamente - no funciona correctamente)

<Window x:Class="TestApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <ComboBox Height="23" Width="300" 
        ItemsSource="{Binding Path=Objects}" 
        > 
      <ComboBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock DataContext="{Binding}"> 
         <TextBlock.Text> 
          <MultiBinding StringFormat="{} {0} | {1}"> 
           <Binding Path="ID" /> 
           <Binding Path="Name" /> 
          </MultiBinding> 
         </TextBlock.Text> 
        </TextBlock> 
       </DataTemplate> 
      </ComboBox.ItemTemplate> 
     </ComboBox> 
    </Grid> 
</Window> 

El segundo código muestra lo que quiero el cuadro combinado para mostrar {ID} | {Name}, pero le quita una función común del ComboBox. En el primer ejemplo, cuando se selecciona el ComboBox, el usuario puede comenzar a escribir en él y hacer que salte por la lista. Por ejemplo, si presiona la letra A, salta a "Adam", B salta a "Bill", etc. Así se supone que debe funcionar un ComboBox. Pero, cuando anulo ComboBox ItemTemplate, pierde esa funcionalidad. ¿Hay alguna otra forma de vincular lo que necesito y mantener esa funcionalidad o reactivarla? Tal vez el ItemTemplate está mal configurado?

+0

¿He entendido bien su pregunta o se encontraba buscando otra cosa? Avíseme si necesito aclarar algo o si estuve siguiendo el camino aquí :) –

Respuesta

22

Véase mi respuesta a esta pregunta: Can I do Text search with multibinding

Desafortunadamente TextSearch.Text no funciona en un DataTemplate. Creo que tiene dos opciones aquí

Opción 1. Conjunto IsTextSearchEnabled True para el cuadro combinado, anular ToString en su clase de origen y cambiar el MultiBinding de TextBlock a una unión

<ComboBox ... 
      IsTextSearchEnabled="True"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding}"/> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

public class Person 
{ 
    public override string ToString() 
    { 
     return String.Format("{0} | {1}", Name, ID); 
    } 

    public string Name { get; set; } 
    public int ID { get; set; } 
} 

Opción 2. Cree una nueva propiedad en su clase de origen donde combine Nombre e ID para el TextSearch.TextPath. También, usted debe llamar a OnPropertyChanged para NameAndId cada vez que lo haces por Name o ID

<ComboBox ... 
      TextSearch.TextPath="NameAndId" 
      IsTextSearchEnabled="True"> 


public string NameAndId 
{ 
    return String.Format("{0} | {1}", Name, ID); 
} 
+0

+1 La opción 2 funciona para mí. ¡Gracias! – surfen

Cuestiones relacionadas