2010-08-02 1 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> 

Wie lege ich das ausgewählte Element auf das aktuelle Jahr in dem Code hinter? wieSet SelectedItem von WPF ComboBox

Etwas ...

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

Antwort

33

Es gibt viele Möglichkeiten, dies zu tun, aber für Ihr Beispiel, würde ich die ComboBox-Tag wie folgt ändern:

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

ich die Attribut- hinzugefügt Definition SelectedValuePath="Content". Danach können Sie den Wert mit einer entsprechenden Zeichenfolge festgelegt, z.B .:

cmbBudgetYear.SelectedValue = "2009"; 

Darauf achten, dass der Wert ein String sein muss. Für Ihr Beispiel verwenden

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

Eine weitere Idee

Wenn Sie den Code-behind sowieso verwenden, wäre es eine Möglichkeit, die Combobox mit ganzen Zahlen zu füllen. Someting wie:

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

..then können Sie die Werte auswählen extrem einfach wie

cmbBudgetYear.SelectedValue = 2009; 

... und Sie würden auch andere Vorteile haben.

+4

Haha ... SelectedValuePath = "Inhalt" war es. Vielen Dank! – knockando

+0

Ausgezeichnete Antwort, hat mir auch geholfen. – Califf

0

In diesem Fall sollten Sie in der Lage sein, einfach .Text() zu verwenden, um es zu setzen:

cmbBudgetYear.Text = "2010"; 

Für den Wert nach einer Änderung bekommen, aber, und es ist vielleicht, weil ich nicht SelectedValuePath="Content" überall gesetzt habe, oder vielleicht, weil ich SelectedValue nicht verwendet habe, um es zu setzen (und warum ich es erwähne), wird es etwas komplizierter, den tatsächlichen Wert zu bestimmen, wie Sie dies nach dem Hinzufügen des Ereignishandlers für SelectionChanged in der XAML tun müssen:

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()); 
} 

Wenn ein Parser benötigt, weil .SelectedValue.ToString() Sie so etwas wie System.Windows.Controls.Control: 2010 geben, so haben Sie es zu analysieren, um den Wert zu erhalten:

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

Zumindest das ist, was in Ich lief .... Ich weiß, das Frage war über das Setzen der Box, aber kann nicht nur Einstellung, ohne darüber zu sprechen, wie man es bekommen, später, auch, wie Sie es einstellen wird bestimmen, wie Sie es bekommen, wenn es geändert wird.

0

Es funktioniert gut für mich.

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 
    }));