如何从带有复选框的列表视图中获取选定项目的列表? (后面没有代码)
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);
}
});
}
抱歉,如果问题不清楚或答案显而易见,我必须在没有深入研究 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);
}
});
}