WPF IsEditable = true ComboBox rempli d'objets affiche le ToString () comme l'élément sélectionné

StackOverflow https://stackoverflow.com/questions/1844156

Question

La zone de liste déroulante WPF permet l'édition, ce qui est très bien si tous les éléments de votre zone de liste déroulante sont des chaînes, ou une méthode ToString () définie sur eux.

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

Je reçois une liste d'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 à savoir MyNamespace.MyObjectName

Certaines solutions ont été

  • utiliser ValuePath pour se lier à une propriété sur l'objet, mais si vous avez besoin votre écran à plus d'un ceux-ci, pas de chance.
  • mettre en oeuvre la méthode ToString () sur votre objet

est-il une autre autour?

Était-ce utile?

La solution

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>

Le côté positif 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, en vous ItemTemplate sur mesure, vous pouvez lier le TextBlock à autre chose en dehors de la méthode ToString de l'objet.

Autres conseils

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top