Установить 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
}));