Wpf 如何获取ListView复选框列状态

Wpf 如何获取ListView复选框列状态,wpf,listview,checkbox,Wpf,Listview,Checkbox,因此,我有列表视图和复选框列: <GridViewColumn Header="Name"> <GridViewColumn.CellTemplate> <DataTemplate> <StackPanel Orientation="Horizontal" Margin="0,0,0,0"> <CheckBox Margin="0,0,0,0"/>

因此,我有
列表视图
复选框

<GridViewColumn Header="Name">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Margin="0,0,0,0">
                <CheckBox Margin="0,0,0,0"/>
                <TextBlock x:Name="textBlock"
                       Text="{Binding Name}"
                       Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListViewItem}}}"
                       Style="{StaticResource TextBlockDefaultStyle}"
                       Margin="0,2,0,0"/>
            </StackPanel>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

我的模型有几个
属性
,如
名称
说明
等,我的
列表视图
也包含简单的
复选框

我的
ListView
填充了几个对象,我想实现两件事:

  • 如果我选中了特定的
    复选框
    我希望所有其他
    复选框
    变成
    取消选中
    (如果我有另一个
    复选框
    处于选中状态)

  • 如何确定选中的特定
    对象

  • XAML:


    为什么要替换RadioButton中的复选框?我希望选项选择“无”。我已修改答案,将其更改为
    复选框
    。OK看起来不错,但如何仅启用1个复选框?(我的意思是,如果选中了特定复选框,并且我想选中不同的复选框,那么我想取消选中第一个复选框)我的意思是,我只想选中一个复选框,所以当我选中复选框时,我想让其他复选框变为未选中。调整后的回答:选中一个复选框时,取消选中其他复选框。如何设置或绑定ListView的ItemsSource属性。请发布视图模型的代码。很多时候,当我看到
    时,作者实际上想要
    (可以单击某些文本以选中复选框)。只是一个旁注提示,也许你想要与其他人不同的东西;)
    <ListView x:Name="MyListView" SelectionChanged="MyListView_OnSelectionChanged" SelectionMode="Single">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name" Width="100">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <CheckBox>
                                    <CheckBox.IsChecked>
                                        <Binding Path="IsSelected" RelativeSource="{RelativeSource AncestorType={x:Type ListViewItem}}"/>
                                    </CheckBox.IsChecked>
                                </CheckBox>
                                <TextBlock Text="{Binding Name}"/>
                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Description" Width="100">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Description}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
    
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
    
            // some data for testing
            MyListView.ItemsSource = new List<MyData>
            {
                new MyData {Name = "123", Description = "ABC"},
                new MyData {Name = "456", Description = "EFG"},
                new MyData {Name = "789", Description = "HIJ"},
            };
        }
    
        private void MyListView_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.AddedItems != null && e.AddedItems.Count > 0)
            {
                var selectedItem = (MyData)e.AddedItems[0];
                // do something
            }
        }
    }
    
    public class MyData
    {
        public string Name { get; set; }
    
        public string Description { get; set; }
    }
    
    <CheckBox Checked="ToggleButton_OnChecked">
        <CheckBox.IsChecked>
            <Binding Path="IsSelected" RelativeSource="{RelativeSource AncestorType={x:Type ListViewItem}}"/>
        </CheckBox.IsChecked>
    </CheckBox>
    
    private void ToggleButton_OnChecked(object sender, RoutedEventArgs e)
    {
        foreach (var checkBox in FindAllCheckBoxes(MyListView).Where(x => !ReferenceEquals(x, sender)))
        {
            checkBox.IsChecked = false;
        }
    }
    
    private static IEnumerable<CheckBox> FindAllCheckBoxes(Visual element)
    {
        if (element == null)
        {
            return null;
        }
    
        var checkBoxes = new List<CheckBox>();
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
        {
            var visual = VisualTreeHelper.GetChild(element, i) as Visual;
            var checkBox = visual as CheckBox;
    
            if (checkBox != null)
            {
                checkBoxes.Add(checkBox);
            }
            else
            {
                checkBoxes.AddRange(FindAllCheckBoxes(visual));
            }
        }
    
        return checkBoxes;
    }