捕获WPF列表框复选框选择

时间:2010-05-14 16:19:41

标签: c# .net wpf

一直想弄清楚,如何从列表框中捕获事件。在模板中,我添加了参数IsChecked =“”,它启动了我的方法。但是,问题是尝试捕获方法中已检查的内容。 SelectedItem仅返回当前选中的内容,而不是复选框。

object selected = thelistbox.SelectedItem;
DataRow row = ((DataRowView)selected).Row;
string teststring = row.ItemArray[0].ToString();    // Doesn't return the checkbox!

<ListBox IsSynchronizedWithCurrentItem="True" Name="thelistbox" ItemsSource="{Binding mybinding}">
    <ListBox.ItemTemplate>
            <DataTemplate>
                    <StackPanel>
                            <CheckBox Content="{Binding personname}" Checked="CheckBox_Checked" Name="thecheckbox"/>
                        </StackPanel>
                </DataTemplate>
        </ListBox.ItemTemplate>
</ListBox>

1 个答案:

答案 0 :(得分:1)

理想情况下,您应该将IsChecked绑定到行上的属性,即

<CheckBox Content="{Binding personname}" IsChecked="{Binding IsPersonChecked}" Name="thecheckbox"/>

其中“IsPersonChecked”是DataTable中的列(或绑定的任何内容),就像“personname”一样。然后,您可以读取是否直接从DataRow变量中检查:

DataRow row = ((DataRowView)thelistbox.SelectedValue).Row;
bool isPersonChecked = (bool) row["IsPersonChecked"];

如果键入了DataSet,您显然希望使用类型化的DataRow属性。

请注意,我使用的是SelectedValue,而不是SelectedItem属性。我相信SelectedItem实际上是ListBoxItem的一个实例。如果您想让IsChecked保持未绑定状态,可以使用哪个。然后,您必须考虑完整的模板层次结构来检索CheckBox。类似的东西:

bool isChecked = ((CheckBox)((StackPanel) ((ListBoxItem) thelistbox.SelectedItem).Content).Children[0]).IsChecked ?? false;

凌乱。 (调试并调整层次结构到你实际得到的。我的代码可能不会按原样运行。)

更好的方法是使用CheckBox_Checked处理程序的RoutedEventArgs:

private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
    CheckBox checkBox = (CheckBox) e.Source;
    DataRow row = ((DataRowView) checkBox.DataContext).Row;
    bool isChecked = checkBox.IsChecked ?? false;
}