带复选框的c# WPF列表框-选择显示
本文关键字:选择 显示 列表 WPF 复选框 | 更新日期: 2023-09-27 17:50:15
我使用一个带有复选框的列表框来选择其中的数据。源文件是一个XML文件,如:
<Hosts>
<Host Location="a">
<IP>1.1.1.1</IP>
<HostName>host1</HostName>
</Host>
<Host Location="b">
<IP>2.2.2.2</IP>
<HostName>host2</HostName>>
</Host>
</Hosts>
列表框通过复选框正确显示。当我选择一个或多个条目时,我无法检索相关的主机名。选择是通过:
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
var cb = sender as CheckBox;
var item = cb.DataContext;
// a message box here shows that I have the good content (host1, host2) in item
ListBoxItem listBoxItem = (ListBoxItem)this.MachinesList.ItemContainerGenerator.ContainerFromItem(item);
listBoxItem.IsSelected = true;
MessageBox.Show(listBoxItem.ToString());
}
我正在使用一个按钮来显示内容:
private void button1_Click(object sender, RoutedEventArgs e)
{
foreach (Object selecteditem in MachinesList.SelectedItems)
{
MessageBox.Show(selecteditem.ToString());
}
}
System.XML.XmlElement恐怕选择适用于整个XML数据,而不是特定的节点。Ie:
ListBoxItem listBoxItem = (ListBoxItem)this.MachinesList.ItemContainerGenerator.ContainerFromItem(item);
不选择节点,而是选择完整的XML元素。
Listbox是用:
<!-- MACHINES LIST -->
<!-- Grouping option for machines list -->
<CollectionViewSource x:Key="cvs" Source="{Binding Source={StaticResource HostsData}}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="@Location" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
<!-- Display option for groups in machines list -->
<DataTemplate x:Key="categoryTemplate">
<TextBlock Text="{Binding Path=Name}" FontWeight="Bold" Background="Gold" Margin="0,5,0,0"/>
</DataTemplate>
<!-- Display option for machines in machines list -->
<DataTemplate x:Key="MachinesTemplate">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/> <ColumnDefinition/>
</Grid.ColumnDefinitions>
<CheckBox Content="{Binding XPath=HostName}" Checked="CheckBox_Checked" Grid.Row="0" Grid.Column="0" Margin="1"/>
</Grid>
</DataTemplate>
<ListBox Name="MachinesList"
Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" TextBlock.FontSize="9" Margin="2"
ItemsSource="{Binding Source={StaticResource cvs}}"
ItemTemplate="{StaticResource MachinesTemplate}"
SelectionMode="Multiple">
<ListBox.GroupStyle>
<GroupStyle HeaderTemplate="{StaticResource categoryTemplate}" />
</ListBox.GroupStyle>
</ListBox>
有什么帮助吗?我被困在那里几个小时了,一点线索都没有。
假设您想要选择Host元素,那么您现在所拥有的应该能够正常工作,但是您没有为您的MessageBoxes提供足够的细节来查看任何内容。通过在事件处理程序中设置一个断点很容易看到这一点,但如果你想在MessageBoxes中看到更多,你可以更具体地指定要显示的内容。
在Checked处理程序中使用这个,你会看到选中的项是一个"Host"元素:
MessageBox.Show((listBoxItem.Content as XmlElement).Name);
当枚举所选项时,您可以类似地检查它是哪个元素,直至您需要的任何详细级别:
foreach (var selecteditem in MachinesList.SelectedItems.OfType<XmlElement>())
{
MessageBox.Show(selecteditem.InnerXml);
}
在你开始真正使用这个之前,你还需要改变你如何处理CheckBox和ListBoxItem的同步。您至少还需要在CheckBox上有一个Unchecked处理程序,但是您可以通过去掉事件处理程序并使用数据绑定来简化它:
<DataTemplate x:Key="MachinesTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<CheckBox Content="{Binding XPath=HostName}" Margin="1"
IsChecked="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}"/>
</Grid>
</DataTemplate>
我假定您将返回一个XElement,因为您首先将它们添加到MachinesList中。但这怎么会是个问题呢?您仍然可以从该XML片段中选择子元素并选择主机名。