C# WPF AutoCompleteBox: Как связать текст программно
Из XAML я могу создавать и присваивать значения свойствам AutoCompleteBox, но я хочу сделать это программно.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace comboboxSuggestions
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var mylist = new List<person>
{
new person()
{
name = "vikas",
lastName = "bansal"
},
new person()
{
name = "viksit",
lastName = "bansal"
},
new person()
{
name = "sunil",
lastName = "bansal"
}
};
autocompleteBox.ItemsSource = mylist;
autocompleteBox.ValueMemberPath = "name";
var binding = new System.Windows.Data.Binding("name")
{
};
autocompleteBox.SetBinding(AutoCompleteBox.TextProperty, binding);
}
private void autocompleteBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (autocompleteBox.SelectedItem != null)
{
person s = autocompleteBox.SelectedItem as person;
string lastName = s.lastName;
}
}
}
public class person
{
public string name { get; set; }
public string lastName { get; set; }
}
}
Файл XAML
<Controls:AutoCompleteBox Name="autocompleteBox" SelectionChanged="autocompleteBox_SelectionChanged"
Height="30" Width="200"
/>
Результат
1 ответ
Проблема в том, что ваш ItemsSource
это List<person>
, но вы не предоставили ItemTemplate
это говорит AutoCompleteBox
что отображать для каждого person
, Когда вы видите "comboboxSuggestions.person", это потому, что по умолчанию ItemTemplate
просто делает person.ToString()
,
Вот как бы вы решили это:
Сначала добавьте fullname
собственность на person
, как это:
public class person
{
public string name { get; set; }
public string lastname { get; set; }
public string fullname => name + " " + lastname;
}
Затем определите ItemTemplate
в вашем XAML, вот так:
<Controls:AutoCompleteBox Name="autocompleteBox"
SelectionChanged="autocompleteBox_SelectionChanged"
Height="30"
Width="200">
<Controls:AutoCompleteBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding fullname}" />
</DataTemplate>
<Controls:AutoCompleteBox.ItemTemplate>
</Controls:AutoCompleteBox>
(Извиняюсь, если есть какие-либо опечатки, я не проверял этот код.)
редактировать
Чтобы избежать определения шаблона в XAML, вы можете просто переопределить ToString()
за person
вместо.
public class person
{
public string name { get; set; }
public string lastname { get; set; }
public override string ToString()
{
return name + " " + lastname;
}
}