2011-08-02 45 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; 

然後我們簡單地得到使用

chkBox.IsChecked; 

把這些代碼裏面你的SelectionChanged功能的校驗值,你會獲取複選框值。你也可以在那裏設置它。

我希望這會有所幫助。

編輯:

但我會建議在不同的事件上運行此代碼。如果用戶點擊已經選擇的項目來切換複選框,SelectionChanged事件將不會觸發。如果您在運行代碼之前測試實際上是否存在selectedItem,我會建議您使用MouseUp。這樣做的

+0

我有三個的TextBlocks和複選框列表框裏面的數據的數據模板中綁定..how檢查複選框是否被選中或不...上面的代碼在chkbox返回null ....普萊舍helpo .. –

0

一個簡單的方法是這樣的:

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

然後在您的處理程序:

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

解決這個的一種方式是通過切換到數據綁定。

創建一個類(姑且稱之爲A)表示在列表框中的單個項目和屬性添加到一個名爲選擇的類(它實現INotifyPropertyChanged)。

創建的ObservableCollection的一個實例(我們將其命名爲COL),並添加一個實例爲每一行/項。

現在綁定列表框,如下所示:

首先在代碼lstDatabase.DataContext = col;

然後在XAML:

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

(我沒有使用編譯器檢查)

現在,如果你想知道選擇什麼樣的項目才使在收集這個選擇:

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