带复选框的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>

有什么帮助吗?我被困在那里几个小时了,一点线索都没有。

带复选框的c# WPF列表框-选择显示

假设您想要选择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片段中选择子元素并选择主机名。