Set 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)
571   3  

3 ответов:

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

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

Я добавил определение атрибута 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;

... и у вас были бы и другие преимущества.

В этом случае вы должны быть в состоянии просто использовать .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;
}
По крайней мере, это то, с чем я столкнулся.... Я знаю, что этот вопрос касался установки коробки, но не могу обратиться только к установке, не говоря о том, как ее получить, позже тоже, поскольку то, как вы ее установите, определит, как вы ее получите, если она будет изменена.

Это прекрасно работает для меня.

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

Comments

    Ничего не найдено.