#c# #wpf #combobox
#c# #wpf #поле со списком
Вопрос:
У меня есть a, ComboBox
и все его ComboBoxItem
сгенерированы во время выполнения (программно). Всякий раз, когда появляется a ComboBox.SelectionChange
, программа будет показывать MessageBox
, показывающий выбранное содержимое ComboBox
private void cb2_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
MessageBox.Show(cb2.SelectedItem.ToString());
}
Тем не менее, это показать мне:
Система.Windows.Элементы управления.Элемент ComboBoxItem: Привет, мир
Я хочу показать только «Hello World», но не «System ….» вещь. Я попробовал SelectedValue, и это тоже показывает то же самое.
Ответ №1:
Вам нужно преобразовать выбранный элемент в ComboBoxItem и получить только его содержимое.
MessageBox.Show((cb2.SelectedItem as ComboBoxItem).Content.ToString());
Комментарии:
1. Я думаю, что прямое приведение было бы здесь лучше, потому что, если приведение не выполняется успешно, исключение становится более четким, чем при использовании
as
.2. @svick: Возможно, я, например, не стал бы делать ни того, ни другого, поскольку разбрасывание элементов ComboBoxItems — это не то, что когда-либо понадобится делать.
Ответ №2:
Вам следует рассмотреть возможность использования привязок, а не обработчиков событий. Это приводит к гораздо более чистому коду и большему разделению проблем между представлением и процессом:
Объявите свою комбинацию следующим образом:
<ComboBox x:Name="cboCountries" DisplayMemberPath="Name" SelectedItem="{Binding SelectedCountry}" ItemsSource="{Binding Countries}" />
Затем вы привязываете свой ComboBox к коллекции в вашем окне (или, предпочтительно, ViewModel):
public Window1()
{
InitializeComponent();
DataContext = this;
this.Countries = new ObservableCollection<Country>();
this.Countries.Add(new Country {Id = 1, Name = "United Kingdom" });
this.Countries.Add(new Country {Id = 1, Name = "United States" });
}
public ObservableCollection<Country> Countries {get; set;}
private Country selectedCountry;
public Country SelectedCountry
{
get { return this.selectedCountry; }
set
{
System.Diagnostics.Debug.WriteLine(string.Format("Selection Changed {0}", value.Name));
this.selectedCountry = value;
}
}
Выражение привязки к свойству SelectedValue из списка приведет к запуску параметра настройки свойств в SelectedCountry в SelectedCountry всякий раз, когда выбранный элемент изменяется в списке.
public class Country
{
public int Id { get; set;}
public string Name {get; set;}
}