我目前正在开发一个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);
}
如何从选择更改的事件处理程序中获取复选框值。
感谢您提供的任何帮助。
答案 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);