2010-08-17 4 views
1

Question: Quelqu'un peut-il s'il vous plaît fournir un exemple de code complet qui montre comment on modifie par programme le SelectedItem d'un ComboBox WPF lié aux données sans utiliser MyComboBox.SelectedIndex?Comment définir par programme SelectedItem d'un ComboBox WPF lié aux données?

Exemple de code : Voici ce que j'ai actuellement.

XAML:

<Window x:Class="Wpf.ComboBoxDemo.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions> 
     <ComboBox Name="MyComboBox" DisplayMemberPath="LastName" SelectedIndex="0"/> 
    </Grid> 
</Window> 

code-behind:

using System.Collections.ObjectModel; 
using System.Windows; 

namespace Wpf.ComboBoxDemo 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      ObservableCollection<Person> myPersonList = new ObservableCollection<Person>(); 

      Person personJobs = new Person("Steve", "Jobs"); 
      Person personGates = new Person("Bill", "Gates"); 

      myPersonList.Add(personJobs); 
      myPersonList.Add(personGates); 

      MyComboBox.ItemsSource = myPersonList; 

      // How do I programmatically select the second Person, i.e. "Gates"? 
      // The best pratice must be to somehow to set something like IsCurrentlySelected on the model, so the view update automatically. But how? 
      MyComboBox.SelectedIndex = 1; // This works, but is there no way without using the index? 

     } 

     private class Person 
     { 
      public string FirstName { get; set; } 
      public string LastName { get; set; } 

      public Person(string firstName, string lastName) 
      { 
       FirstName = firstName; 
       LastName = lastName; 
      } 
     } 
    } 
} 

Des questions similaires: J'ai bien sûr des recherches sur Internet en premier lieu, mais rien trouvé qui m'a aidé.

  • Modification du SelectedItem d'un combobox lié enum-inside ViewModel (MSDN)
  • définir par programme SelectedItem ComboBox dans WPF (3.5sp1) (Stack Overflow)

Répondre

1

Au sommet de la tête (I peut-être tort), faire la fenêtre et la mise en œuvre INotifyPropertyChanged ajouter l'événement:

namespace Wpf.ComboBoxDemo 
{ 
    public partial class MainWindow : Window, INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     public MainWindow() 
     { 

Puis ajouter une propriété pour le moment élément sélectionné qui notifie les changements:

 private Person _selected; 
     public Person MySelected 
     { 
      get { return _selected; } 
      set 
      { 
       if (value != _selected) 
       { 
        _selected = value;    
        if (PropertyChanged != null) 
        { 
         PropertyChanged(this, 
          new PropertyChangedEventArgs("MySelected")); 
        } 
       } 
      } 
     } 

Rabattre le combobox (la liaison pourrait être plus avancée ici en utilisant FindAncestor mais parfois de garder les choses simples que je mets le datacontext dans le code derrière):

XAML :

 <ComboBox 
      Name="MyComboBox" 
      DisplayMemberPath="LastName" 
      SelectedItem="{Binding MySelected}" /> 

code derrière:

public MainWindow() 
    { 
     InitializeComponent(); 
     // ... 

     // this will cause the "MySelected" binding to target the correct property on this object 
     MyComboBox.DataContext = this; 
    } 

Je pense que ça va quelque chose comme ça. Je ne peux pas le tester tout de suite mais j'espère que cela vous poussera dans la bonne direction.

Editer: Si vous voulez essayer "l'autre sens" de la liaison heres comment. Développez le SelectedItem de liaison à ressembler à ceci:

 <ComboBox 
      Name="MyComboBox" 
      DisplayMemberPath="LastName" 
      SelectedItem="{Binding MySelected, 
       RelativeSource={RelativeSource FindAncestor, 
        AncestorType={x:Type Window}}}" /> 

Vous pouvez maintenant sauter la sélection du DataContext dans le code derrière:

public MainWindow() 
    { 
     InitializeComponent(); 
     // ... 

     // this will cause the "MySelected" binding to target the correct property on this object 
     //MyComboBox.DataContext = this; 
    } 

En effet, ce mode FindAncestor fait le ComboBox se trouvent l'objet auquel la propriété il devrait lier, plutôt que vous affirmer spécifiquement.

Le sujet brûlant actuel ici au bureau est lequel de ces deux manières sont les meilleurs. Pour moi, c'est juste plus de code XAML et moins de code derrière (ou l'inverse), il suffit d'utiliser la méthode qui place le code où vous êtes à l'aise pour travailler.Je pense qu'il existe des scénarios où ce dernier est préféré (comme lorsque vous incluez des contrôles de liaison de données à l'intérieur d'autres contrôles), mais Im juste barbotage donc je n'ai pas vraiment compris ces parties pour le moment.

+0

Un grand coup de coude, merci beaucoup pour votre aide! – Lernkurve

+0

Content de pouvoir aider. :) J'ai ajouté la deuxième méthode de liaison, si vous voulez l'essayer. Ce code n'est pas testé non plus alors j'espère que j'ai de la chance. – Mizipzor

+0

Maintenant, je suis déchiré entre this.DataContext = myPersonlist (qui n'a pas besoin de la ComboBox pour avoir un nom) et votre approche FindAncestor qui n'a pas besoin de code-behind du tout. – Lernkurve