web-dev-qa-db-fra.com

Définir SelectedItem de WPF ComboBox

<ComboBox Grid.Row="1" Grid.Column="0" Width="Auto" Name="cmbBudgetYear">
   <ComboBoxItem Content="2009" />
   <ComboBoxItem Content="2010" />
   <ComboBoxItem Content="2011" />
   <ComboBoxItem Content="2012" />
</ComboBox>

Comment définir l'élément sélectionné sur l'année en cours dans le code suivant?

Quelque chose comme...

cmbBudgetYear.SelectedItem = cmbBudgetYear.Items(
                                         get the item with the Now.Year.ToString)
22
knockando

Il existe de nombreuses façons de procéder mais pour votre exemple, je modifierais le ComboBox-Tag comme suit:

<ComboBox Grid.Row="1" Grid.Column="0" 
          Name="cmbBudgetYear" SelectedValuePath="Content">

J'ai ajouté l'attribut-defition SelectedValuePath="Content". Après cela, vous pouvez définir la valeur avec une chaîne correspondante, par exemple:

cmbBudgetYear.SelectedValue = "2009";

Veillez à ce que la valeur soit une chaîne. Pour votre exemple, utilisez

cmbBudgetYear.SelectedValue = DateTime.Now.Year.ToString();

Une idée supplémentaire

Si vous utilisez le code-behind de toute façon, serait-il une possibilité de remplir la liste déroulante avec des entiers. Quelque chose comme:

for(int y=DateTime.Now.Year;y>DateTime.Now.Year-10;y--){
 cmbBudgetYear.Items.Add(y);
}

..alors vous pouvez sélectionner des valeurs extrêmement simples comme 

cmbBudgetYear.SelectedValue = 2009;

... et vous auriez aussi d'autres avantages.

40
HCL

Dans mon cas, j'ai ajouté les valeurs manuellement avec:

myComboBox.Items.Add("MyItem");

et puis je sélectionne le désiré avec:

myComboBox.SelectedItem = "WantedItem";

au lieu de: 

myComboBox.SelectedValue = "WantedItem";
4
Simone Brognoli

Dans ce cas, vous devriez pouvoir simplement utiliser .Text() pour le définir:

cmbBudgetYear.Text = "2010";

Pour obtenir la valeur après un changement, cependant, c'est peut-être parce que je n'ai pas défini SelectedValuePath="Content" partout, ou peut-être parce que je n'ai pas utilisé SelectedValue pour le définir (et pourquoi je le mentionne), cela devient légèrement plus compliqué Déterminez la valeur réelle, comme vous devez le faire après avoir ajouté le gestionnaire d'événements pour SelectionChanged dans le code XAML:

private void cmbBudgetYear_SelectionChanged(object sender, EventArgs e)
{
    ComboBox cbx = (ComboBox)sender;
    string yourValue = String.Empty;
    if (cbx.SelectedValue == null)
        yourValue = cbx.SelectionBoxItem.ToString();
    else
       yourValue = cboParser(cbx.SelectedValue.ToString());
}

Où un analyseur est nécessaire parce que .SelectedValue.ToString() vous donnera quelque chose comme System.Windows.Controls.Control: 2010, vous devez donc l'analyser pour obtenir la valeur:

private static string cboParser(string controlString)
{
   if (controlString.Contains(':'))
   {
       controlString = controlString.Split(':')[1].TrimStart(' ');
   }
   return controlString;
}

Au moins, c’est ce que j’ai rencontré… Je sais que cette question portait sur le paramétrage de la boîte, mais je ne peux pas aborder le paramètre uniquement sans expliquer comment l’obtenir, plus tard également, car la manière dont vous définissez cette option déterminera comment vous l'obtenez s'il est changé.

1
vapcguy

Ça fonctionne bien pour moi.

ObservableCollection<OrganizationView> Organizations { get; set; }

Organizations = GetOrganizations();

await Dispatcher.BeginInvoke((Action)(() =>
    {
    var allOrganizationItem = new OrganizationView() { ID = 0, IsEnabled = true, Name = "(All)" }; // It is a class
    Organizations.Add(allOrganizationItem);
    cbOrganizations.DisplayMemberPath = "Name";
    cbOrganizations.SelectedValuePath = "ID";
    cbOrganizations.ItemsSource = null;
    cbOrganizations.ItemsSource = Organizations; // Set data source which has all items
    cbOrganizations.SelectedItem = allOrganizationItem; // It will make it as a selected item
    }));   
0