2010-08-02 7 views
17
<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é dans l'année en cours dans le code derrière?Définir SelectedItem de WPF ComboBox

Quelque chose comme ...

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

Répondre

33

Il existe plusieurs façons de le faire, mais pour votre exemple, je changerais le ComboBox-Tag comme suit:

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

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

cmbBudgetYear.SelectedValue = "2009"; 

Prenez soin que la valeur doit être une chaîne. Pour 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 possible de remplir le combobox avec des nombres entiers. Someting comme:

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

..then vous pouvez sélectionner les valeurs simples comme extrêmement

cmbBudgetYear.SelectedValue = 2009; 

... et vous auriez également d'autres avantages.

+4

Haha ... SelectedValuePath = "Contenu" était-il. Merci! – knockando

+0

Excellente réponse, m'a aidé aussi. – Califf

0

Dans ce cas, vous devriez être en mesure de simplement utiliser .Text() pour le définir:

cmbBudgetYear.Text = "2010"; 

Pour obtenir la valeur après un changement, cependant, et peut-être parce que je ne l'ai pas mis SelectedValuePath="Content" partout, ou peut-être parce que je n'ai pas utilisé SelectedValue pour le définir (et pourquoi je le mentionne), il devient légèrement plus compliqué de déterminer la valeur réelle, comme vous devez le faire après avoir ajouté le gestionnaire d'événements pour SelectionChanged dans le 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()); 
} 

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

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

Au moins, ce que je suis tombé sur .... Je sais que ce La question portait sur la définition de la boîte, mais ne peut pas aborder uniquement le paramètre sans parler de la façon de l'obtenir, plus tard, aussi, car la façon dont vous le définissez déterminera comment vous l'obtiendrez si elle est modifiée.

0

Cela fonctionne très 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 
    }));