一直想弄清楚,如何从列表框中捕获事件。在模板中,我添加了参数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>
答案 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;
}