Установить SelectedItem из 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>

Как установить выделенный элемент в текущий год в коде?

Что-то вроде...

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

Ответы

Ответ 1

Существует много способов сделать это, но для вашего примера я бы изменил ComboBox-Tag следующим образом:

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

Я добавил атрибут-defition SelectedValuePath="Content". После этого вы можете установить значение с соответствующей строкой, например:

cmbBudgetYear.SelectedValue = "2009";

Обратите внимание, что значение должно быть строкой. Для вашего примера используйте

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

Дополнительная идея

Если вы все равно используете код-код, это будет возможность заполнить combobox целыми числами. Сокет:

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

.. тогда вы можете выбрать значения, предельно простые, например

cmbBudgetYear.SelectedValue = 2009;

... и у вас также будут другие преимущества.

Ответ 2

В этом случае вы можете просто использовать .Text() для его установки:

cmbBudgetYear.Text = "2010";

Чтобы получить значение после изменения, и, возможно, потому, что я не устанавливал SelectedValuePath="Content" всюду, или, может быть, потому, что я не использовал SelectedValue для его установки (и почему я упоминаю об этом), становится немного сложнее определить фактическое значение, так как вам нужно сделать это после добавления обработчика событий для SelectionChanged в 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());
}

Если необходим синтаксический анализатор, потому что .SelectedValue.ToString() предоставит вам что-то вроде System.Windows.Controls.Control: 2010, поэтому вам нужно проанализировать его, чтобы получить значение:

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

По крайней мере, это то, с чем я столкнулся... Я знаю, что этот вопрос касался установки поля, но он не может адресовать только настройку, не говоря уже о том, как ее получить, а позже, как вы ее установили будет определять, как вы его получите, если он будет изменен.

Ответ 3

Это отлично работает для меня.

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