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