2015-06-16 3 views
1

Я пытаюсь получить метку, связанную со значением ComboBox, как таким образом:Как получить соответствующий ComboBox Tag

var league = ((ComboBoxItem)this.League.SelectedValue).Tag.ToString(); 
Console.WriteLine(league); 

Компилятор показать мне Invalid Cast Exception

Я только хочу, чтобы получить связанный тег выбранного значения на пользователе, в частности:

(значение ComboBox и теги)

-Италии (пункт) - 10 (Метка)
-Fra nce (item) - 12 (тег)

Если пользователь выбрал Италию, в коде я должен получить "10". Но я не могу этого сделать, что я делаю неправильно?

UPDATE (Populate комбо):

List<RootObject> obj = JsonConvert.DeserializeObject<List<RootObject>>(responseText); 

     foreach (var item in obj) 
     { 
      foreach (var code in nation_code) 
      { 
       if (code.Equals(item.League)) 
       { 
        League.Items.Add(item.Caption); 
        //link for each team 
        League.Tag = item.Links.Teams.href; 
       } 
      } 
     } 
+0

Что такое null? '.Tag'? – Jens

+0

Нулевое исключение теперь исправлено, извините. Компилятор показывает мне: Invalid Cast Excception. Извините за мою ошибку. –

+0

, тогда проблема очевидна. вы не можете отличить SelectedValue к ComboBoxItem. Вы могли бы выяснить с помощью отладчика, с экземпляром SelectedValue. – Jens

ответ

1

Если вы видите тег устанавливает для себя и не поле со списком для его отдельного элемента.

Вы можете создать словарь и использовать его в качестве источника данных вашего поля со списком. Укажите значение и отображения членов в поле со списком с ключом словаря и значения атрибутов

Попробуйте изменить логику населения комбо следующим образом -

 List<RootObject> obj = JsonConvert.DeserializeObject<List<RootObject>>(responseText); 
     Dictionary<string, string> comboSource = new Dictionary<string, string>(); 

     foreach (var item in obj) 
     { 
      foreach (var code in nation_code) 
      { 
       if (code.Equals(item.League)) 
       { 
        comboSource.Add(item.Caption, item.Links.Teams.href); 

       } 
      } 
     } 

     League.ValueMember = "Value"; 
     League.DisplayMember = "Key"; 
     League.DataSource = comboSource; 

, а затем требуемые значения могут быть выбраны с помощью selectedText и SelectedValue свойства ,

 League.SelectedText; //Return the "item.Caption" 
    League.SelectedValue; //Return the "item.Links.Teams.href" 

Для WPF мы должны использовать различные свойства ВИЗ. ItemsSource, DisplayMemberPath и SelectedValuePath при связывании комбо коробка. Вышеупомянутое решение для форм выигрыша.

+0

Элемент значения, элемент отображения и источник данных подчеркнуты красным цветом => ComboBox не содержит определения ValueMember и не найден ни один метод, принимающий этот аргумент. –

+0

Код предназначен для приложения в форме Windows. Для WPF просто используйте следующее: «League.DisplayMemberPath =« Value »; League.SelectedValuePath =« Key »; – Yogi

+0

и для источника, ItemSource? –

0

Вы можете добавить любой объект в ComboBox, он не обязательно должен быть строкой, его просто нужно перезаписать .ToString().

Вы могли бы определить класс:

class League { 
    public string Country { get; set; } 
    public int Id { get; set; } 

    public override string ToString() { 
     return Country; 
    } 
} 

, а затем просто добавить эти объекты в ComboBox:

comboBox.Items.Add(new League { Country = "France", Id = 10 }); 

Вы можете просто бросить в SelectedItem вашего COMBOBOX обратно к классу:

var selectedLeague = (League)comboBox.SelectedItem; 
//access selectedLeague.Country; 
//access selectedLeague.Id; 
Смежные вопросы