Выбранный элемент со списком не показывает своего значения

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