- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 DataGrid
,其中包含许多 Jobs
。这些 Jobs
中的每一个都有一个与之关联的员工,我想根据这些工作中的员工进行过滤。所以我有四个 CheckBoxes
;
<CheckBox x:Name="employeeARad" Content="EmployeeA" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="18" Margin="7,0,0,5"/>
<CheckBox x:Name="employeeBRad" Content="EmployeeD" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="18" Margin="7,5,0,5"/>
<CheckBox x:Name="employeeCRad" Content="EmployeeC" HorizontalAlignment="Left" Margin="7,5,0,5" VerticalAlignment="Top" FontSize="18"/>
<CheckBox x:Name="employeeDRad" Content="EmployeeD" HorizontalAlignment="Left" Margin="7,5,0,5" VerticalAlignment="Top" FontSize="18"/>
我从我的数据库中检索并填充数据的ObservableCollection
。然后,我使用以下方法将此集合绑定(bind)到我的 DataGrid
:dataGrid.ItemsSource = _jobDataService.GetJobList();
。正如我之前所说,每项工作都有其模型的一部分与 Employee
相关联。这是 Job
的模型;
class JobModel
{
public int CaseNumber { get; set; }
public string EmployeeName { get; set; }
public string CaseNotes { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateDeadline { get; set; }
public string CaseClient { get; set; }
}
我的真正问题是如何根据 CheckBoxes
的选择过滤绑定(bind)到 DataGrid
的这个集合?
最佳答案
当您绑定(bind)到 WPF 中的集合时,派生自 ICollectionView
的对象是在幕后创建的。该接口(interface)支持通过使用各种属性对集合进行排序和过滤。
我通常做的是有一个 ObservableCollection<T>
分配给一个私有(private)字段,其中包含所有数据。然后我有一个类型为 ICollectionView
的相应公共(public)属性,我对其应用任何排序或过滤条件。
以下是一个简单窗口的 XAML,其中包含工作列表,以及用于按员工姓名筛选列表的复选框。为简单起见,我仅在职位列表中显示员工姓名:
<Window x:Class="StackOverflow.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DockPanel Margin="10">
<StackPanel x:Name="_employees" DockPanel.Dock="Top">
<CheckBox Content="Fred" IsChecked="True" Click="OnCheckBoxClick" />
<CheckBox Content="Wilma" IsChecked="True" Click="OnCheckBoxClick" />
<CheckBox Content="Barney" IsChecked="True" Click="OnCheckBoxClick" />
<CheckBox Content="Betty" IsChecked="True" Click="OnCheckBoxClick" />
</StackPanel>
<ListBox ItemsSource="{Binding JobsCollectionView}"
DisplayMemberPath="EmployeeName" Margin="0,10,0,0" />
</DockPanel>
</Window>
这是此窗口的隐藏代码(我重复使用了您现有的 JobModel
类,因此此处未显示该代码):
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace StackOverflow
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
_jobs = new ObservableCollection<JobModel>
{
new JobModel { EmployeeName = "Fred" },
new JobModel { EmployeeName = "Wilma" },
new JobModel { EmployeeName = "Fred" },
new JobModel { EmployeeName = "Barney" },
new JobModel { EmployeeName = "Betty" },
};
JobsCollectionView = CollectionViewSource.GetDefaultView(_jobs);
DataContext = this;
}
readonly ObservableCollection<JobModel> _jobs;
public ICollectionView JobsCollectionView { get; private set; }
void OnCheckBoxClick(object sender, RoutedEventArgs e)
{
var checkedEmployees = new HashSet<string>();
foreach (CheckBox checkBox in _employees.Children)
{
if (checkBox.IsChecked == true)
{
checkedEmployees.Add((string) checkBox.Content);
}
}
JobsCollectionView.Filter =
job => checkedEmployees.Contains((job as JobModel).EmployeeName);
}
}
}
可以看到私有(private)_jobs
持有工作和公众集合的领域JobsCollectionView
提供访问 ICollectionView
的属性实现(CollectionViewSource.GetDefaultView
方法用于获取它)。
每个 CheckBox 控件都有一个 Click 事件处理程序(它们都指向相同的方法),它简单地遍历复选框以构建一个员工姓名列表当前“选中”( checkedEmployees
),然后设置 Filter
Collection View 的属性以应用适当的过滤逻辑。基本上,过滤器是一个委托(delegate),它从 View 中获取一个项目(在您的例子中是一个 JobModel
对象)并返回一个 bool 值,该值指示该特定对象是否应包含在 View 中。在这里,我只是检查工作中的员工姓名是否包含在过滤后的员工姓名集中。
需要注意的一件事是 ICollectionView
的性能对于非常大的列表,排序和过滤可能是一个问题,在这种情况下,您可能需要通过从原始数据集中构建一个全新的列表来进行排序/过滤。不过,我会先尝试使用 Collection View 方法,然后看看效果如何。
关于c# - 基于 CheckBoxes 过滤 ObservableCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34042389/
在检查复选框时我发现有写 CheckBox checkbox = (CheckBox)sender 在 checkBox1_CheckedChanged 事件上。 请解释一下这是什么意思? 最佳答案
我正在使用来自命名空间 System.Windows.Forms 的 ToolTip 类编辑我的 Web 应用程序;我的代码中有几个复选框,因此显示此错误: 'CheckBox' is an ambi
我正在制作 Bootstrap 复选框下拉菜单,选项包含在 中。处理点击的标签,但我也有一个 在 a 标签内。 当用户按下实际复选框而不是仅按下 时,就会出现我的问题。元素。两者都被点击并且发生了
TLDR:使用defaultChecked而不是checked,工作jsbin . 尝试设置一个简单的复选框,在选中时会划掉其标签文本。由于某种原因,当我使用该组件时,handleChange 没有被
我想拥有它,所以如果复选框为 NULL 或 0,则它不像值为 1 时那样喜欢。另外,有没有办法将选中的框限制为 10 个? 当前代码: if(isset($_POST['submit'])){//to
如果我选中一个复选框,下拉列表应该只显示在该复选框旁边,但它会显示在它下面的所有其他复选框中。 这是我在 html 代码中使用的 css .sub-nav { display: none; } inp
我在警报对话框中有一个带有复选框的数据表,当我单击该复选框时,它没有选中(选中=选中)该框。我跟着这个video 这是我的尝试 import 'package:flutter/material.dar
如果单独使用,以下代码效果很好, Angular6.0 不允许 [(ngModel)] 与 FormGroup (Reactive Forms)。 As 在 angular 6.0 中已弃用,并将在
那么我应该使用哪个来选择元素?我仅使用复选框作为示例,这个问题涉及所有表单元素。 实际上,当我们这样做时,哪个更快: li:first 或 li:eq(0) ? 最佳答案 来自the document
问题 : 我有一个列表框,其中列表框是复选框。在第一次单击时,复选框被选中并选中。在第二次单击时,仅设置复选框。可以使用箭头键重新选择不同的复选框。我的目标是,首先选中该复选框,然后再检查(再次单击它
我似乎无法弄清楚如何让复选框和相关文本出现在一行上。文本很短,所以它似乎不是宽度问题。 我尝试在控件上设置 display:inline,但是当它呈现时,在输入和标签周围添加了一个跨度,并且具有 di
创建带有复选框列的 Table 非常容易,例如,使用 SWT.CHECK 标志。但是如何使某些表格行中的复选框不可编辑而其他行中的复选框保持可编辑? 最佳答案 我不知道这样做的简单方法。 但我看到了两
是否可以使用 TogglerBar 而不是 2 个复选框来显示或不显示不同的形状。 TogglerBar 的每个按钮中都写有绿色和红色? Manipulate[ Graphics[{If[thePin
我需要更改 Windows Phone 8 中 LongListMultiSelector 的复选框的颜色,因为我的背景是白色,这可能吗? 谢谢。 最佳答案 为此,您必须首先通过在 visual st
我有一个带有插件 Slick.CheckboxSelectColumn 的网格。 是否可以在没有 Jquery 的情况下隐藏某些行中的复选框?我想可以使用 Formatter。 这是带有 slickg
所以我有这个... 在这里,id 是有道理的值在引号中,因为它是一个字符串标识符。但是type呢?值(value)?不是 checkbox一种类型,例如 String 和 Boolean?为什么我总
问题: 如果用户选中了复选框,我将尝试验证下拉列表,如您在屏幕一中所见。 问题: 那么,如果用户选择了标题中的所有复选框,我该如何验证复选框呢?如您所见,屏幕二。如果我选中所有复选框,那么我希望启动验
我知道它有点重复,我正在尝试以不同的方式做到这一点,从而重新发布这个问题。 我想要实现的是,当有人“取消选中”OSPF 复选框时..被动接口(interface)检查也应该自动“取消选中”。我正在尝试
这是代码(是的,我使用的是基本的 reset.css): .checkbox { border: 1px solid black; width: 10px; height: 10px; }
我正在尝试显示多组带有标题复选框的复选框,如下图所示。 从数据库中我得到这样的数据, CODE SUBCODE DESCR DESCR
我是一名优秀的程序员,十分优秀!