2011-02-10 4 views
10

PersonVM.csWPF: la modifica di ItemTemplate di un ComboBox rimuove la possibilità di saltare l'elenco durante la digitazione. Qualche modo per risolvere questo problema?

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 (versione di lavoro funzionale - non quello che voglio per visualizzare)

<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 (visualizza correttamente - non funziona correttamente)

<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> 

Il secondo codice visualizza quello che voglio il ComboBox per visualizzare {ID} | {Name}, ma toglie una funzione comune del ComboBox. Nel primo esempio, quando viene selezionato il ComboBox, l'utente può iniziare a digitarlo e farlo scorrere verso il basso nell'elenco. Ad esempio, se si preme la lettera A, si passa a "Adam", B salta a "Bill", ecc. Ecco come si suppone che funzioni un ComboBox. Ma, quando ignoro il ItemTemplate di ComboBox, perde quella funzionalità. C'è un altro modo per legare ciò di cui ho bisogno e mantenere tale funzionalità o per riattivarla? Forse l'ItemTemplate è impostato in modo errato?

+0

Ho capito la tua domanda correttamente o Stavi cercando qualcosa d'altro? Fammi sapere se ho bisogno di chiarire qualcosa o se sono qui per tracciare il percorso :) –

risposta

22

Vedere la mia risposta a questa domanda: Can I do Text search with multibinding

Purtroppo TextSearch.Text non funziona in un DataTemplate. Penso che tu abbia due opzioni qui

Opzione 1. Set IsTextSearchEnabled a True per ComboBox, ignorare ToString nella classe di origine e cambiare l'MultiBinding in TextBlock a una rilegatura

<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; } 
} 

Opzione 2. Crea una nuova proprietà nella classe di origine in cui combini il nome e l'ID per lo TextSearch.TextPath. Inoltre, si dovrebbe chiamare OnPropertyChanged per NameAndId ogni volta che lo si fa per Name o ID

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


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

+1 L'opzione 2 funziona per me. Grazie! – surfen

Problemi correlati