2009-12-04 20 views
12

La zone de liste déroulante Wpf permet l'édition, et c'est très bien si tous vos éléments de zone de liste déroulante sont des chaînes ou ont une méthode ToString() définie dessus .WPF IsEditable = true ComboBox rempli d'objets affiche ToString() en tant qu'élément sélectionné

Lorsque vous sélectionnez un élément, il est affiché comme du texte, il ne se sert pas DataTemplate, il appelle simplement ToString() sur l'élément sélectionné.

j'obtenir une liste des articles dans ma liste déroulante en bas formatées avec mon modèle d'élément, lorsque je sélectionne un i obtenir le nom de l'objet-à-dire MyNamespace.MyObjectName

Quelques solutions ont été

  • utilisation ValuePath de se lier à une propriété sur l'objet, mais si vous avez besoin votre écran à plus d'un de ces , mauvaise chance.
  • mettre en œuvre la méthode ToString() sur votre objet

est-il une autre autour?

+0

oui la deuxième méthode fonctionne parfaitement. –

Répondre

27

Vous pouvez le faire entièrement dans XAML

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

L'avantage est que vous pouvez définir et modifier ce que vous voulez mais dans votre XAML sans code-behind. Vous liez le ItemsSource à votre collection d'objets, puis vous définissez le chemin sur lequel baser votre recherche sur TextSearch.TextPath. Ensuite, dans votre ItemTemplate personnalisé, vous pouvez lier le TextBlock à autre chose en dehors de la méthode ToString de l'objet.

+0

Oublié d'ajouter, la clé ici est de garder votre DataTemplate. La propriété jointe TextSearch.TextPath est ce qui fait que votre zone de texte dans la zone de liste déroulante affiche la propriété que vous voulez. –

+1

or absolu. les propriétés ci-jointes m'obtiennent à chaque fois, parce qu'il est si facile de ne pas les connaître. Merci. –

+0

* OMG * Je voudrais pouvoir upvote plus d'une fois. Je souhaite également qu'il soit venu quand je cherchais "WPF ComboBox SelectedValuePath ToString" - espérons les mentionner dans un commentaire aidera une autre sève pauvre pas chasser sa queue pendant 2 heures en essayant de comprendre cela dans le futur. La moitié de la bataille en utilisant un grand cadre est d'apprendre à penser comme les gens qui ont conçu le cadre (en supposant que vous ne pouvez pas simplement mémoriser l'ensemble du cadre énorme. ;-)) Je pensais vraiment à celui-ci dans le « mauvais " direction. –

3

Vous pouvez utiliser un IValueConverter pour convertir le « objet » à une valeur de chaîne et le dos. Voir l'exemple de code dans le lien IValueConverter pour plus de détails.

+0

merci pour la réponse, l'homme je me sens comme un idiot, je le savais. Je blâme le vendredi. :) –

+0

ive convertisseurs utilisés plusieurs fois, où placeriez-vous ce convertisseur, pas sur la propriété ItemsSource, Ive a essayé sur la propriété SelectedItem et le convertisseur est touché, mais quand je retourne une chaîne que je reçois toujours le MyNamespace.MyObjectName, avez-vous essayé cela avec un combobox avant? –

+0

Vérifiez l'exemple dans le lien. Il vous montre comment utiliser un convertisseur avec un combobox (via les comboboxes ItemsTemplate). –