2011-08-02 1 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

iは3つのテキストブロックを持っているし、チェックボックスがチェックされているかどうかを確認するかどうかを..howデータテンプレート内のデータバインディングとしてリストボックス内のボックスをチェックし... chkboxでnullを返す上記のコード.... pleseはhelpo .. –

0

一つの簡単な方法はこれです

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

これを解決する方法は、データバインディングに切り替えることです。

リストボックスの1つの項目を表すクラスを作成して(INotifyPropertyChangedを実装します)、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;

そして、次のように

は今のListBoxをバインドあなたはどのようなアイテムをお知りになりたい場合は今だけのコレクションにこの選択を行う選択されています

var selectedItems = col.Where(item => item.IsSelected); 
関連する問題