WPF: изменение ComboBox ItemTemplate удаляет возможность сбрасывать список по мере ввода. Любой способ исправить это?
PersonVM.cs
public class MainWindowVM
{
public MainWindowVM()
{
PersonList = new ObservableCollection<Person>(Employees);
}
private Person[] Employees = new Person[]
{
new Person { ID = 1, Name = "Adam" },
new Person { ID = 2, Name = "Bill" },
new Person { ID = 10, Name = "Charlie" },
new Person { ID = 15, Name = "Donna" },
new Person { ID = 20, Name = "Edward" }
};
public ObservableCollection<Person> PersonList { get; set; }
}
Person.cs
public class Person
{
public string Name { get; set; }
public int ID { get; set; }
}
MainWindow.xaml (функционально работающая версия - не то, что я хочу отобразить)
<Window x:Class="TestApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<ComboBox Height="23" Width="300"
ItemsSource="{Binding Path=Objects}"
DisplayMemberPath="Name"
>
</ComboBox>
</Grid>
</Window>
MainWindow.xaml (отображается правильно - не работает должным образом)
<Window x:Class="TestApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<ComboBox Height="23" Width="300"
ItemsSource="{Binding Path=Objects}"
>
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock DataContext="{Binding}">
<TextBlock.Text>
<MultiBinding StringFormat="{} {0} | {1}">
<Binding Path="ID" />
<Binding Path="Name" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
</Window>
Второй код показывает, что я хочу, чтобы ComboBox отображал {ID} | {Name}
, но он убирает общую функцию ComboBox. В первом примере, когда выбран ComboBox, пользователь может начать вводить его и перепрыгнуть вниз по списку. Например, если вы нажмете букву A, она перескочит на "Адам", B переходит на "Билл" и т.д. Вот как должен функционировать ComboBox. Но, когда я переопределяю ComboBox ItemTemplate, он теряет эту функциональность. Есть ли другой способ привязать то, что мне нужно, и сохранить эту функциональность или повторно ее использовать? Возможно, ItemTemplate настроен неправильно?
Ответы
Ответ 1
См. мой ответ на этот вопрос: Могу ли я выполнять поиск по тексту с многосвязным интерфейсом
К сожалению, TextSearch.Text не работает в DataTemplate. Я думаю, у вас есть два варианта.
Вариант 1. Установите IsTextSearchEnabled в True для ComboBox, переопределите ToString в вашем исходном классе и измените MultiBinding в TextBlock на привязку
<ComboBox ...
IsTextSearchEnabled="True">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
public class Person
{
public override string ToString()
{
return String.Format("{0} | {1}", Name, ID);
}
public string Name { get; set; }
public int ID { get; set; }
}
Вариант 2. Создайте новое свойство в своем исходном классе, где вы объединяете имя и идентификатор для TextSearch.TextPath
. Кроме того, вы должны называть OnPropertyChanged
для NameAndId
всякий раз, когда вы делаете это для Name
или ID
<ComboBox ...
TextSearch.TextPath="NameAndId"
IsTextSearchEnabled="True">
public string NameAndId
{
return String.Format("{0} | {1}", Name, ID);
}