如何从带有复选框的列表视图中获取选定项目的列表? (后面没有代码)

How to get a list of selected items from a listview with checkboxes? (Without code behind)

抱歉,如果问题不清楚或答案显而易见,我必须在没有深入研究 c# 和 WPF 的情况下为学校做这个项目。

我在 this

之后构建了一个带有复选框的列表视图

当我单击“过滤类别”按钮时,我想简单地获取带有加粗复选框的所有项目(类别)的列表。

我发现了一些类似的问题,答案涉及使用我无法做到的代码。

<ListView x:Name="ListViewCategories" ItemsSource="{Binding CourseCategories}" >
                <ListView.View>
                    <GridView>
                        <GridViewColumn DisplayMemberBinding="{Binding Title}" Header="Category"/>
                        <GridViewColumn Header="Display" >
                            <GridViewColumn.CellTemplate>
                                <DataTemplate >
                                    <StackPanel Orientation="Horizontal">
                                        <CheckBox IsChecked="{Binding Path=IsSelected, 
                                            RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}"/>
                                    </StackPanel>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>
        </Grid>
        <Button  Content="Filter Categories" Command="{Binding FilterCategory}" CommandParameter="???" />

我应该使用按钮 CommandParameter 将其传递给 ViewModel 吗?如果是,如何? 如果不是,我怎样才能在我的 ViewModel 中获取所选项目的列表?

ViewModel的本质:

namespace Project.ViewModel {
    public class QuestionsViewModel : ViewModelCommon {

        private Course course;
        public Course Course { get => course; set => SetProperty(ref course, value, OnRefreshData); }

        private ObservableCollection<Category> courseCategories;
        public ObservableCollection<Category> CourseCategories {
            get => courseCategories;
            set => SetProperty(ref courseCategories, value);
        }

        public ICommand FilterCategory { get; set; }

        public QuestionsViewModel() : base() {

            FilterCategory = new RelayCommand<List<Category>>(categories => {
                foreach (var c in categories) {
                    Console.WriteLine(c.Title);
                }
            });
        }
   
    }
}

我应该在“类别”模型中添加一个 bool 属性 显示并将其绑定到复选框吗? 如果是,我仍然不知道如何获得所有加厚项目的列表。

Should I add a bool property display in the "category" model and bind it to the checkbox?

是的。

If yes, I still don't know how to get a list of all thicked items.

只需从 courseCategories 集合中过滤掉它们,例如使用 LINQ:

var checkedItems = courseCategories.Where(x => x.YourBoolProperty).ToArray():

对于那些想要实现同样目标的人。

我已将布尔值 属性 添加到模型(“显示”)。

<ListView x:Name="ListViewCategories" ItemsSource="{Binding CourseCategories}" >
                <ListView.View>
                    <GridView>
                        <GridViewColumn DisplayMemberBinding="{Binding Title}" Header="Category" />
                        <GridViewColumn Header="Display" >
                            <GridViewColumn.CellTemplate>
                                <DataTemplate >
                                    <StackPanel Orientation="Horizontal">
                                        <CheckBox IsChecked="{Binding Display}"/>
                                    </StackPanel>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>
        </Grid>
        <Button  Content="Filter Categories" {Binding FilterCategory}"  Style="{StaticResource DarkBlueButton}"  />

在 ViewModel 中绑定显示的复选框

public bool? Display {
            get { return Display; }
            set { Display = value; }
               
        }
public ICommand FilterCategory { get; set; }

        public QuestionsViewModel() : base() {
            
            FilterCategory = new RelayCommand(() => {
                var checkedItems = courseCategories.Where(x => x.Display).ToArray();
                foreach (var c in checkedItems) {
                    Console.WriteLine(c.Title);
                }
            });
        }