2011-08-02 5 views
0

현재 C# wpf 프로젝트에서 작업 중입니다. 목록 상자가 있고 동적으로 다음 코드를 사용하여 목록 상자에 확인란을 추가하고 있습니다.ListBox 및 선택한 확인란 찾기

while (reader.Read()) 
{ 
    Console.WriteLine("Database: " + reader.GetString("Database")); 
    string databaseName = reader.GetString("Database"); 
    CheckBox chkDatabase = new CheckBox(); 
    chkDatabase.Content = databaseName.Replace("_", "__"); 
    chkDatabase.Uid = "chk_" + reader.GetString("Database"); 
    chkDatabase.Checked += new RoutedEventHandler(chkDatabase_Checked); 

    lstDatabase.Items.Add(chkDatabase); 
} 

이 작업은 정상적으로 작동하며 확인란이 선택되었는지 여부를 확인하기 위해 routedeventhandler가 올바르게 작동합니다.

내가 할 수있게하려는 것은 실제로 행을 확인하는 대신 사용자가 확인란이있는 행을 클릭 할 수있게하려는 것입니다. 나는 다음과 같이 변경 선택에 대한 목록 상자에 이벤트 핸들러를 추가했습니다 :

private void lstDatabase_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    Console.WriteLine("Selection Changed"); 
    ListBox checkbox = (ListBox)e.Source; 
    Console.WriteLine("Checkbox2: " + checkbox.SelectedValue); 
} 

어떻게 선택 변경 이벤트 처리기에서 체크 박스 값을 얻을 수 있습니다.

도움을 주셔서 감사합니다.

답변

1

확인란 자체를 가져 오려면 선택한 항목 (체크 박스는 목록 상자의 항목에만 추가 했으므로 확인란)이 확인란으로 전송됩니다.

CheckBox chkBox = lstDatabase.SelectedItem as CheckBox; 

그런 다음 우리는 단순히 기능을 인 selectionchanged 내부

chkBox.IsChecked; 

그 코드를 넣어 사용 checkvalue를 얻을 당신은 체크 박스 값을 검색 할 수 있습니다. 당신도 그것을 설정할 수 있습니다.

이 정보가 도움이되기를 바랍니다.

편집 :

그러나이 코드를 다른 이벤트에서 실행하는 것이 좋습니다. 체크 박스를 토글하기 위해 사용자가 이미 선택된 항목을 클릭하면 SelectionChanged 이벤트는 실행되지 않습니다. 코드를 실행하기 전에 selectedItem이 실제로 있는지 테스트 한 경우 MouseUp을 제안합니다. 핸들러에서 다음

ListBoxItem lbItem = new ListBoxItem(); 
lbItem.Content = chkDatabase; 
lstDatabase.Items.Add(lbItem); 

: 그 일의

+0

나는 데이터 템플리트 내부의 데이터 바인딩으로서 listbox 내에 세 개의 텍스트 블록과 체크 박스를 가지고있다. 체크 박스가 체크되었는지 아닌지를 체크하는 ... 위의 코드는 chkbox ....에서 null을 반환한다. plese 헬프 .. –

0

한 가지 간단한 방법이있다

bool chkVal = false; 
ListBoxItem selItem = lstDatabase.SelectedItem as ListBoxItem; 
if (selItem != null && selItem.Content is CheckBox) 
    chkVal = ((CheckBox)selItem.Content).IsChecked; 
0

이 문제를 해결하는 방법은 데이터 바인딩로 전환하는 것입니다.

목록 상자의 단일 항목을 나타내는 클래스를 만들고 (이를 A라고 부름) INTifyPropertyChanged를 구현하고 Selected라는 클래스에 속성을 추가합니다.

ObservableCollection (col이라는 이름을 지정)의 인스턴스를 만들고 각 행/항목에 대해 A의 인스턴스를 추가합니다.

<ListBox ItemsSource="{Binding}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Content="{Binding Name}" IsChecked="{Binding IsSelected}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

(내가 이것을 확인하기 위해 컴파일러를 사용하지 않았다)

:

첫 번째 코드에서 XAML에 lstDatabase.DataContext = col;

그런 다음 다음과 같이

이제 목록 상자를 바인딩 선택한 항목이 무엇인지 알고 싶다면 컬렉션에서이 항목을 선택하십시오.

var selectedItems = col.Where(item => item.IsSelected);