我使用数据模板来可视化 ComboBox 中的一些项目,ItemsSource 绑定到 ObservableCollection。为简单起见,假设我将人员放入 ObservableCollection:
public class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
}
我的数据模板看起来像这样:
<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>
现在我想在 ComboBox 中启用全名的自动完成功能,而无需在我的 person 类中引入第三个属性。因此,我不想在 ComboBox 上使用 TextSearch.TextPath 属性,而是想在 DataTemplate 中绑定每个 ComboBoxItem 的 TextSearch.Text-Property。不幸的是,当我这样做时(它适用于 MultiBinding 和 StringFormat,使用 Snoop 测试),绑定值仅为我的 StackPanel 注册,但使用 Snoop(伟大的工具)我发现这个 stackpanel 只是作为进一步的 ComboBoxItemTemplate 的内容,它会在我的外部 StackPanel 周围放置另一个边框等,最后是 ComboBoxItem-tag。因此,TextSearch.Text-setting 无效,因为它必须设置在创建的 ComboBoxItem 中,而不是其中的某个位置。
现在提问:如何仅使用 XAML-Styles 和 -Control-Templates 将此 TextSearch.Text-Property 从我的 DataTemplate 传播到周围的 ComboBoxItem?该解决方案可能会修改 ComboBox 和 ComboBoxItem 的默认 ControlTemplates 以及我的自定义 (Item-)DataTemplate,但不要使用任何 Code-Behind,或者至少不要太多。也许附加的行为也可以。但我几乎可以肯定,必须有一种方法可以让它在没有 TemplateBinding 或 RelativeSource-stuff 的情况下工作......当然,该解决方案必须让我的键盘选择和文本完成工作,s.th。当列表包含 Hans Josef 和 Hans Peter 时,输入“Hans”应该自动建议 Hans Josef,而快速输入“Hans P”应该自动建议 Hans Peter。
有什么解决办法吗?