Uso un datatemplate per visualizzare alcuni elementi in un ComboBox, l'ItemSource è associato a ObservableCollection. Per farla semplice, diciamo che ho messo persone in ObservableCollection:Impostare TextSearch.Text per WPF-ComboBoxItem tramite DataTemplate
public class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
}
mio DataTemplate assomiglia a questo:
<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>
Ora voglio per consentire il completamento automatico per i nomi completi nel ComboBox senza introdurre un terza proprietà sulla mia classe di persona. Quindi non voglio usare TextSearch.TextPath Property sul ComboBox, ma preferirei associare la proprietà TextSearch.Text di ogni ComboBoxItem nel DataTemplate. Sfortunatamente, quando lo faccio (che funziona con un MultiBinding e StringFormat, testato con Snoop), il valore associato è registrato solo per il mio StackPanel, ma usando Snoop (ottimo strumento) ho scoperto che questo stackpanel serve come contenuto per qualche altro ComboBoxItemTemplate, che mette un altro bordo ecc. E infine un tag ComboBoxItem attorno al mio StackPanel esterno. Pertanto, l'impostazione TextSearch.Text non è efficace, perché deve essere impostata nel ComboBoxItem creato e non da qualche parte all'interno.
domanda ora: Come posso propagare a questo TextSearch.Text-Proprietà dal mio DataTemplate alle circostanti ComboBoxItem utilizzando XAML-Stili e solo -Control-Modelli? La soluzione può modificare i ControlTemplates predefiniti di ComboBox e ComboBoxItem e il mio DataTemplate personalizzato (Item-), ma non utilizzare alcun Code-Behind, o almeno non troppo. Forse un comportamento attaccato andrebbe bene, anche. Ma sono quasi sicuro che ci deve essere un modo per farlo funzionare senza, TemplateBinding o RelativeSource-stuff ... E ovviamente la soluzione deve fare in modo che la mia selezione da tastiera e la gestione del testo funzionino, per esempio. quando la lista contiene Hans Josef e Hans Peter, quindi entrare in "Hans" dovrebbe autosuggest Hans Josef, mentre entrare "Hans P" abbastanza rapidamente dovrebbe autosuggest Hans Peter.
Qualche soluzione?
Almeno ora mi sento abbastanza fiducioso, che il compito non è davvero troppo facile. O il lungo testo fa semplicemente scappare la gente in preda al panico ... –
Sono vicino a rinunciare. Sono riuscito a far sì che ComboBoxItem abbia la corretta proprietà TextSearch.Text impostandola in ComboBox.ItemContainerStyle (anziché in ItemTemplate, come facevo prima). Ora sembra molto bello nell'albero visivo (Snoop di nuovo), ma sfortunatamente non ha alcun effetto. Non è stata effettuata alcuna selezione dopo aver digitato "Hans" o qualsiasi altra cosa. –