J'utilise un datatemplate pour visualiser certains éléments dans un ComboBox, le ItemsSource est lié à un ObservableCollection. Pour simplifier, disons que je mets les personnes dans le ObservableCollection:Définir TextSearch.Text pour WPF-ComboBoxItem via DataTemplate
public class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
}
Mon DataTemplate ressemble à ceci:
<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>
Maintenant, je veux permettre autocomplétion des noms complets dans la zone de liste déroulante sans introduire une troisième propriété sur ma classe de personne. Par conséquent, je ne souhaite pas utiliser la propriété TextSearch.TextPath dans la zone de liste déroulante, mais je souhaite lier la propriété TextSearch.Text de chaque objet ComboBoxItem dans le DataTemplate. Malheureusement, quand je fais cela (qui fonctionne avec MultiBinding et StringFormat, testé avec Snoop), la valeur liée est enregistrée pour mon StackPanel seulement, mais en utilisant Snoop (excellent outil), j'ai trouvé que cette pile sert de contenu pour ComboBoxItemTemplate, qui place une autre bordure etc. et enfin une balise ComboBoxItem autour de mon StackPanel externe. Par conséquent, le paramètre TextSearch.Text n'est pas efficace, car il doit être défini dans le ComboBoxItem créé, et non quelque part à l'intérieur. Comment puis-je propager cette TextSearch.Text-Property de mon DataTemplate au ComboBoxItem environnant en utilisant XAML-Styles et -Control-Templates uniquement? La solution peut modifier les ControlTemplates par défaut de ComboBox et ComboBoxItem et mon DataTemplate personnalisé (Item-), mais ne pas utiliser de Code-Behind, ou du moins pas trop. Peut-être qu'un comportement attaché serait bien aussi. Mais je suis presque sûr qu'il doit y avoir un moyen de le faire fonctionner sans, TemplateBinding ou RelativeSource-stuff ... Et bien sûr, la solution doit faire en sorte que ma sélection au clavier et la complétion de texte fonctionnent. Quand la liste contient Hans Josef et Hans Peter, alors entrer 'Hans' devrait autosugguer Hans Josef, alors qu'entrer 'Hans P' assez rapidement devrait autosuggest Hans Peter.
Des solutions?
Au moins maintenant je me sens assez confiant, que la tâche n'est en effet pas trop facile. Ou le texte long fait juste fuir les gens ... –
Je suis sur le point de l'abandonner. J'ai réussi à obtenir le ComboBoxItem pour porter la TextSearch.Text-propriété correcte en le définissant dans le ComboBox.ItemContainerStyle (au lieu du ItemTemplate, comme je l'ai fait auparavant). Maintenant, il semble assez bien dans l'arbre visuel (Snoop à nouveau), mais malheureusement, il n'a aucun effet. Il n'y a pas de sélection après avoir tapé "Hans" ou autre chose. –