2011-06-12 3 views
1

ComboBox 및 해당 ComboBoxItem이 모두 런타임에 (프로그래밍 방식으로) 생성됩니다.ComboBox SelectedItem의 값이 표시되지 않습니다.

System.Windows.Controls.ComboBoxItem : 안녕하세요

거기 ComboBox.SelectionChange, 프로그램은 그러나 ComboBox

private void cb2_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    MessageBox.Show(cb2.SelectedItem.ToString()); 
} 

의 선택 내용을 보여주는 MessageBox 표시됩니다 때마다, 그것은 나를 보여입니다

"Hello World"만 표시하고 "System ..."것은 표시하지 않습니다. SelectedValue를 시도했는데 똑같은 것을 보여줍니다.

답변

2

선택한 항목을 ComboBoxItem으로 캐스팅하고 내용 만 가져와야합니다.

MessageBox.Show((cb2.SelectedItem as ComboBoxItem).Content.ToString()); 
+2

캐스트가 성공하지 못하면 'as'를 사용하면 예외가 명확 해 지므로 여기서는 직접 형변환이 더 좋을 것이라고 생각합니다. – svick

+0

@svick : 아마, ComboBoxItems 주위에 캐스팅 한 후에해야 할 일이 아니기 때문에 아마도 하나도하지 않을 것입니다. –

2

이벤트 핸들러가 아닌 바인딩 사용을 고려해야합니다. 다음과 같이 콤보를 선언

:이 훨씬 청소기 코드 및 프리젠 테이션 및 프로세스 사이에 우려의 큰 분리로 연결

<ComboBox x:Name="cboCountries" DisplayMemberPath="Name" SelectedItem="{Binding SelectedCountry}" ItemsSource="{Binding Countries}" /> 

당신은 다음 창에 모음에 콤보 상자를 바인딩 (또는 바람직하게는 뷰 모델) :

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의 속성 setter가 발생할 때마다 콤보에서 선택한 항목이 변경.

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

    public string Name {get; set;} 
} 
관련 문제