You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过复选框设置WPF ListView整行选中(SelectedItem)

问题:点击WPF ListView中的复选框时自动选中对应行

我有一个包含多列GridViewColumn和两个互斥复选框的WPF ListView,目前只能通过鼠标点击行本身来选中整行。希望点击这两个复选框中的任意一个时,自动选中对应的整行,方便后续使用该行数据。

当前XAML布局代码

<ListView Margin="6,2,160,50" Name="EditorList" FontFamily="Calibri" Background="Silver" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.CanContentScroll="False"
          MouseWheel="EditorList_MouseWheel" MouseRightButtonUp="EditorList_MouseRightButtonDown" SelectionMode="Single" SelectionChanged="EditorList_SelectionChanged" >
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Name" Width="100" DisplayMemberBinding="{Binding Path=Name}"/>
            <GridViewColumn Header="Image" Width="60" >
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Image Source="{Binding Mode=TwoWay, Path=ImageSource, UpdateSourceTrigger=PropertyChanged}" Height="50" Width="50" Margin="1" Stretch="Uniform" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Header="Position X" Width="75" DisplayMemberBinding="{Binding Path=Position[0], UpdateSourceTrigger=PropertyChanged}" />
            <GridViewColumn Header="Position Y" Width="75" DisplayMemberBinding="{Binding Path=Position[1], UpdateSourceTrigger=PropertyChanged}" />
            <GridViewColumn Header="Position Z" Width="75" DisplayMemberBinding="{Binding Path=Position[2], UpdateSourceTrigger=PropertyChanged}" />
            <GridViewColumn Header="Rotation X" Width="75"  DisplayMemberBinding="{Binding Path=Rotation[0], UpdateSourceTrigger=PropertyChanged}" />
            <GridViewColumn Header="Rotation Y" Width="75"  DisplayMemberBinding="{Binding Path=Rotation[1], UpdateSourceTrigger=PropertyChanged}" />
            <GridViewColumn Header="Rotation Z" Width="75"  DisplayMemberBinding="{Binding Path=Rotation[2], UpdateSourceTrigger=PropertyChanged}" />
            <GridViewColumn Header="Scale X" Width="75"  DisplayMemberBinding="{Binding Path=Scale[0], UpdateSourceTrigger=PropertyChanged}" />
            <GridViewColumn Header="Scale Y" Width="75"  DisplayMemberBinding="{Binding Path=Scale[1], UpdateSourceTrigger=PropertyChanged}" />
            <GridViewColumn Header="Scale Z" Width="75"  DisplayMemberBinding="{Binding Path=Scale[2], UpdateSourceTrigger=PropertyChanged}" />
            <GridViewColumn Header="Material" Width="75"  DisplayMemberBinding="{Binding Path=Material, UpdateSourceTrigger=PropertyChanged}" />
            <GridViewColumn Header="To Do" Width="100">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel x:Name="stackpanel" Orientation="Vertical">
                            <CheckBox Content="Delete" Tag="{Binding ElementName=stackpanel}" IsThreeState="False" Name="toD" Checked="ToD_Checked" IsChecked="{Binding Path=ToDelete, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ToolTip="delete this item" />
                            <CheckBox Content="Change" Tag="{Binding ElementName=stackpanel}" IsThreeState="False" Name="toC" Checked="ToC_Checked" IsChecked="{Binding Path=ToChange, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ToolTip="change to another item" />
                        </StackPanel>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

现有C#事件处理代码

private void ToD_Checked(object sender, RoutedEventArgs e)
{
    if (sender is CheckBox cbSender)
    {
        if (cbSender.Tag is StackPanel stackpanel)
        {
            if (stackpanel.FindName("toC") is CheckBox cb1)
            {
                cb1.IsChecked = !cbSender.IsChecked;
            }
            ComboChangeItem.Visibility = Visibility.Collapsed;
        }
    }
}
private void ToC_Checked(object sender, RoutedEventArgs e)
{
    if (sender is CheckBox cbSender)
    {
        if (cbSender.Tag is StackPanel stackPanel)
        {
            if (stackPanel.FindName("toD") is CheckBox cb)
            {
                cb.IsChecked = !cbSender.IsChecked;
            }
            ComboChangeItem.Visibility = Visibility.Visible;
        }
    }
}

解决方案

在复选框的Checked事件处理逻辑中,添加对应代码即可实现点击复选框时自动选中对应行:

针对「Change」复选框的处理

将以下代码加入ToC_Checked方法中:

EditorObjects selectedItem = EditorList.ItemsSource.Cast<EditorObjects>().First(a => a.ToChange);
if (selectedItem != null)
{
    EditorList.SelectedItem = selectedItem;
}

针对「Delete」复选框的处理

将以下代码加入ToD_Checked方法中:

EditorObjects selectedItem = EditorList.ItemsSource.Cast<EditorObjects>().First(a => a.ToDelete);
if (selectedItem != null)
{
    EditorList.SelectedItem = selectedItem;
}

修改后,点击任意一个复选框时,对应的行就会被自动选中。


内容的提问来源于stack exchange,提问作者defiant2369

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:37:09