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;
    }
}
Другие вопросы по тегам