データテンプレートを使用して、ComboBoxの一部のアイテムを視覚化します。 ItemsSourceはObservableCollectionにバインドされています。 のは、私がのObservableCollectionに人物を入れたとしましょう、それをシンプルに保つために:DataTemplateを使用してWPF-ComboBoxItemのTextSearch.Textを設定します。
public class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
}
私のDataTemplateは次のようになります。
<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>
今、私は導入せずに、コンボボックス内の完全名の自動補完を有効にします私の人のクラスの3番目のプロパティ。したがって、私はComboBoxでTextSearch.TextPathプロパティを使用するのではなく、代わりにDataTemplateの各ComboBoxItemのTextSearch.Text-Propertyをバインドしたいと思います。 残念なことに、私がこれを行うと(これはMultiBindingとStringFormatで動作し、Snoopでテストされています)、バインドされた値はStackPanelにのみ登録されますが、Snoop(素晴らしいツール)を使用してこのスタックパネルは、 ComboBoxItemTemplateは、別の境界線などを置き、最後にComboBoxItemタグを外側のStackPanelの周りに配置します。したがって、TextSearch.Text設定は、作成されたComboBoxItemに設定されていなければならないため、有効ではありません。
Question Now: XAMLスタイルと-Control-Templatesのみを使用して、このTextSearch.TextプロパティをDataTemplateから周囲のComboBoxItemに伝播するにはどうすればよいですか? 解決策は、ComboBoxとComboBoxItemのデフォルトのControlTemplateとカスタム(Item-)DataTemplateを変更できますが、コードビハインドは使用しないでください。おそらく付随する行動も大丈夫だろう。しかし、私は、TemplateBindingまたはRelativeSource-stuffなしで動作させる方法がなければならないとほとんど確信しています。 もちろん、ソリューションでは、キーボード選択とテキストコンプリートを行う必要があります。リストにハンス・ジョセフとハンス・ピーターが含まれているときは、ハンス・ジョセフを自動尋問するべきです。
すべてのソリューションはありますか?
少なくとも今私はかなり自信を持っています。その作業は実際にはあまり簡単ではありません。または、長いテキストは人々をパニックに逃げさせているだけです... –
私はそれをあきらめているのです。 ComboBoxItemをComboBox.ItemContainerStyle(ItemTemplateの代わりに、これまでのように)で設定して、正しいTextSearch.Text-Propertyを運ぶようにしました。 これはビジュアルツリー(Snoop again)でかなりうまく見えますが、残念ながらそれは何の効果もありません。 'Hans'などの入力後に選択が行われません。 –