2016-04-04 30 views
0

XAML'den AutoCompleteBox'un özelliklerine değer oluşturabilir ve verebiliyorum ancak program aracılığıyla bunu yapmak istiyorum.C# WPF OtomatikCompleteBox: Metni programlı olarak bağlama

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 Dosya

<Controls:AutoCompleteBox Name="autocompleteBox" SelectionChanged="autocompleteBox_SelectionChanged" 
             Height="30" Width="200" 
             /> 

Sonucu

enter image description here

+0

C# kodunun hangi bölümleri çalışmıyor? –

+0

Soruyu güncelledim ve tüm kodu sağladım. @GordonAllocman –

cevap

0

Sorun ItemsSource bir List<person>, ancak söyleyen bir ItemTemplate sağlanmamış olmasıdır inci Her person için ne görüntüleneceğini e AutoCompleteBox. "ComboboxSuggestions.person" öğesini gördüğünüzde, varsayılan ItemTemplate yalnızca person.ToString() yapıyor.

Birincisi, bu gibi person bir fullname özelliği ekleyin:: Sonra

public class person 
{ 
    public string name { get; set; } 
    public string lastname { get; set; } 

    public string fullname => name + " " + lastname; 
} 

, bu gibi XAML içinde ItemTemplate tanımlayın:

<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> 
İşte

Bunu çözmek girerdim

(Herhangi bir yazım hatası varsa özür dileriz, bu kodu test etmedim.)


XAML bir şablonu tanımlama önlemek için Düzenleme, sadece yerine person için ToString() geçersiz olabilir.

public class person 
{ 
    public string name { get; set; } 
    public string lastname { get; set; } 

    public override string ToString() 
    { 
     return name + " " + lastname; 
    } 
} 
+0

Aslında xaml'ye yazmak yerine kodu koddan bağlamak istiyorum. Ben çok fazla xaml yazmak zorunda kalmaman için bir uzatma fonksiyonu yaratmaya çalışıyorum :) çünkü gerçek proje –

+0

Ahh'da 30'dan fazla kutu var, bence 'ToString'i' kişi 'için geçersiz kılabilirsiniz ve bu hile yapardı. Bunun nasıl yapılacağını göstermek için cevabımı değiştireceğim. – devuxer

+0

fakat farklı özelliklere sahip pek çok 'autocompleteboxexs' modelini bağlamak gerekirse ne olur? Sadece tekrar xaml'da {binding xyz} 'yazmak istemediğimi tekrar hatırladım, backend koduna ihtiyacım var –