2016-04-04 4 views
0

Von XAML Ich bin in der Lage zu erstellen und Werte an die Eigenschaften von AutoCompleteBox geben, aber ich möchte es programmgesteuert tun.C# WPF AutoCompleteBox: Wie Text programmatisch zu binden

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 Datei

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

Ergebnis

enter image description here

+0

Welche Teile des C# -Codes funktionieren nicht? –

+0

Ich habe die Frage aktualisiert und den ganzen Code zur Verfügung gestellt. @GordonAllocman –

Antwort

0

Das Problem ist, dass Ihr ItemsSource ein List<person> ist, aber Sie haben keine ItemTemplate versehen, erzählt th e AutoCompleteBox was für jede person angezeigt wird. Wenn Sie "comboboxSuggestions.person" sehen, liegt das daran, dass der Standardwert ItemTemplate nur person.ToString() ist.

Hier ist, wie Sie dieses Problem lösen würde:

Fügen Sie zunächst eine fullname Eigenschaft person, wie folgt aus:

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

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

Dann ein ItemTemplate in Ihrem XAML definieren, wie folgt aus:

<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> 

(Entschuldigung, wenn es irgendwelche Tippfehler gibt, habe ich diesen Code nicht getestet.)


bearbeiten

in XAML definieren, um eine Vorlage zu vermeiden, können Sie außer Kraft setzen nur ToString() für person statt.

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

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

Eigentlich möchte ich Text aus Code binden, anstatt es in XAML zu schreiben. Ich versuche, eine Erweiterungsfunktion zu erstellen, so dass ich nicht so viel Xaml schreiben muss :) weil es mehr als 30 Boxen gibt, gibt es im tatsächlichen Projekt –

+0

Ahh, ich denke, dass Sie 'ToString' für' Person' einfach überschreiben konnten und das würde den Trick machen. Ich werde meine Antwort ändern, um zu zeigen, wie das gemacht würde. – devuxer

+0

aber was, wenn ich das Modell mit vielen 'autocompleteboxexs' mit unterschiedlichen Eigenschaften binden muss? Ich erwähne nur noch einmal, dass ich in xaml nicht {binding xyz} 'schreiben will, ich muss es aus dem Backend-Code herausholen –

Verwandte Themen