データ テンプレートを使用して ComboBox 内のいくつかの項目を視覚化します。ItemsSource は ObservableCollection にバインドされています。簡単にするために、ObservableCollection に人を入れたとしましょう。
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 で氏名のオートコンプリートを有効にしたいと考えています。したがって、ComboBox で TextSearch.TextPath プロパティを使用したくありませんが、代わりに DataTemplate の各 ComboBoxItem の TextSearch.Text-Property をバインドしたいと考えています。残念ながら、これを行うと (MultiBinding と StringFormat で動作し、Snoop でテストされています)、バインドされた値は StackPanel にのみ登録されますが、Snoop (優れたツール) を使用すると、このスタックパネルがさらにいくつかの ComboBoxItemTemplate のコンテンツとして機能することがわかりました、別の境界線などを配置し、最後に外側の StackPanel の周りに ComboBoxItem タグを配置します。したがって、TextSearch.Text-setting は有効ではありません。これは、作成された ComboBoxItem 内ではなく、その中に設定する必要があるためです。
質問: XAML-Styles と -Control-Templates のみを使用して、この TextSearch.Text-Property を DataTemplate から周囲の ComboBoxItem に伝播するにはどうすればよいですか? このソリューションでは、ComboBox と ComboBoxItem の default-ControlTemplates とカスタム (Item-)DataTemplate を変更できますが、コード ビハインドを使用しないか、少なくともあまり使用しません。たぶん、添付された動作も問題ないでしょう。しかし、TemplateBinding や RelativeSource などを使用せずに機能させる方法があるに違いないと確信しています。リストに Hans Josef と Hans Peter が含まれている場合、'Hans' と入力すると Hans Josef が自動提案されますが、'Hans P' と入力すると Hans Peter が自動提案されます。
解決策はありますか?