ListBox并找到所选复选框

时间:2011-08-02 16:26:46

标签: c# wpf checkbox listbox

我目前正在开发一个C#wpf项目。我有一个列表框,我使用以下代码动态地将复选框添加到列表框中。

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);
}

如何从选择更改的事件处理程序中获取复选框值。

感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:1)

要获取复选框本身,我们只需将选中的项目(这是一个复选框,因为您只在列表框的项目中添加了复选框)转换为复选框。

CheckBox chkBox = lstDatabase.SelectedItem as CheckBox;

然后我们只需使用

获取检查值
chkBox.IsChecked;

将该代码放在SelectionChanged函数中,然后您将检索复选框值。你也可以在那里设置它。

我希望这会有所帮助。

编辑:

但是我建议在不同的事件上运行此代码。如果用户单击已选择的项目以切换复选框,则不会触发SelectionChanged事件。如果您在运行代码之前测试实际上有一个selectedItem,我建议使用MouseUp。

答案 1 :(得分: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;

答案 2 :(得分:0)

解决这个问题的方法是切换到数据绑定。

创建一个类(我们称之为A)(实现INotifyPropertyChanged),它表示列表框中的单个项目,并向名为Selected的类添加属性。

创建一个ObservableCollection实例(让我们将其命名为col)并为每一行/项添加一个A实例。

现在按如下方式绑定ListBox:

代码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);
相关问题