C# 如何使用WPF向现有筛选器添加另一个筛选器?
摘要 已成功开发出以下输出: 解释 代码 XAMLC# 如何使用WPF向现有筛选器添加另一个筛选器?,c#,wpf,mvvm,C#,Wpf,Mvvm,摘要 已成功开发出以下输出: 解释 代码 XAML <Grid> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition /> &l
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<StackPanel Grid.Row="0" Grid.Column="0">
<TextBlock Text="Organisation" />
<DataGrid ItemsSource="{Binding OrganisationView}" SelectedItem="{Binding Search}">
</DataGrid>
</StackPanel>
<StackPanel Grid.Row="0" Grid.Column="1">
<TextBlock Text="Organisation Department" />
<DataGrid ItemsSource="{Binding OrganisationDepartmentView}">
</DataGrid>
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="0">
<TextBlock Text="Department" />
<DataGrid ItemsSource="{Binding DepartmentView}">
</DataGrid>
</StackPanel>
</Grid>
这不会返回任何值。将筛选器添加到部门视图:
private bool Filter(DepartmentModel department)
{
return OrganisationDepartmentModels.Any(odm =>
Search == null ||
(Search.Id = odm.OrganisationId && department.Id == odm.DepartmentId));
}
如果集合很大且存在滞后风险,则使用键元组(OrganizationId,DepartmentId)将OrganizationDepartmentModels转换为字典。
并使用键查找,而不是使用Any()-这对于大型集合来说要快得多。现在就开始吧
private bool Filter2(DepartmentModel department)
{
List<OrganisationDepartmentModel> list = OrganisationDepartmentModels.Where(item => (Search.Id == item.OrganisationId)).ToList();
List<DepartmentModel> list2 = DepartmentModels.Where(item => item.Id == department.Id).ToList();
var combined = list2.Where(item => list.Any(x => x.DepartmentId == item.Id));
return combined.All(item => item.Id != department.Id); // Needed to do `All` instead of `Any`
}
private bool Filter2(部门模型部门)
{
List List=OrganizationDepartmentModels.Where(item=>(Search.Id==item.organizationId)).ToList();
List list2=DepartmentModels.Where(item=>item.Id==department.Id).ToList();
var combined=list2.Where(item=>list.Any(x=>x.DepartmentId==item.Id));
返回组合的.All(item=>item.Id!=department.Id);//需要执行'All'而不是'Any'`
}
请澄清您的要求。。。
public class OrganisationDepartmentModel
{
public int Id { get; set; }
public int OrganisationId { get; set; }
public int DepartmentId { get; set; }
public ObservableCollection<OrganisationDepartmentModel> GetOrganisationDepartmentModels()
{
ObservableCollection<OrganisationDepartmentModel> organisationDepartmentModels = new ObservableCollection<OrganisationDepartmentModel>();
organisationDepartmentModels.Add(new OrganisationDepartmentModel { Id = 1, OrganisationId = 1, DepartmentId = 1 });
organisationDepartmentModels.Add(new OrganisationDepartmentModel { Id = 2, OrganisationId = 1, DepartmentId = 2 });
organisationDepartmentModels.Add(new OrganisationDepartmentModel { Id = 3, OrganisationId = 2, DepartmentId = 1 });
organisationDepartmentModels.Add(new OrganisationDepartmentModel { Id = 4, OrganisationId = 3, DepartmentId = 3 });
organisationDepartmentModels.Add(new OrganisationDepartmentModel { Id = 5, OrganisationId = 4, DepartmentId = 1 });
organisationDepartmentModels.Add(new OrganisationDepartmentModel { Id = 6, OrganisationId = 4, DepartmentId = 3 });
return organisationDepartmentModels;
}
}
public class ViewModel : BaseViewModel
{
// Organisations
private ObservableCollection<OrganisationModel> organisationModels;
public ObservableCollection<OrganisationModel> OrganisationModels
{
get { return organisationModels; }
set
{
organisationModels = value;
OnPropertyChanged();
}
}
public OrganisationModel CopyOfOrganisationModel { get; set; }
private ICollectionView organisationView;
public ICollectionView OrganisationView
{
get { return organisationView; }
set
{
organisationView = value;
OnPropertyChanged();
}
}
// Departments
private ObservableCollection<DepartmentModel> departmentModels;
public ObservableCollection<DepartmentModel> DepartmentModels
{
get { return departmentModels; }
set
{
departmentModels = value;
OnPropertyChanged();
}
}
public DepartmentModel CopyOfDepartmentModel { get; set; }
private ICollectionView departmentView;
public ICollectionView DepartmentView
{
get { return departmentView; }
set
{
departmentView = value;
OnPropertyChanged();
}
}
// OrganisationDepartments
private ObservableCollection<OrganisationDepartmentModel> organisationDepartmentModels;
public ObservableCollection<OrganisationDepartmentModel> OrganisationDepartmentModels
{
get { return organisationDepartmentModels; }
set
{
organisationDepartmentModels = value;
OnPropertyChanged();
}
}
public OrganisationDepartmentModel CopyOfOrganisationDepartmentModel { get; set; }
private ICollectionView organisationDepartmentView;
public ICollectionView OrganisationDepartmentView
{
get { return organisationDepartmentView; }
set
{
organisationDepartmentView = value;
OnPropertyChanged();
}
}
// Filtering here
private bool Filter(OrganisationDepartmentModel organisation)
{
return organisation.OrganisationId == Search.Id;
}
private OrganisationModel search;
public OrganisationModel Search
{
get { return search; }
set
{
search = value;
OnPropertyChanged();
OrganisationDepartmentView.Refresh();
}
}
// Constructor
public ViewModel()
{
CopyOfOrganisationModel = new OrganisationModel();
CopyOfDepartmentModel = new DepartmentModel();
CopyOfOrganisationDepartmentModel = new OrganisationDepartmentModel();
RefreshData();
}
// Mehtods to refresh data
public void RefreshData()
{
OrganisationModels = CopyOfOrganisationModel.GetOrganisationModels();
DepartmentModels = CopyOfDepartmentModel.GetDepartmentModels();
OrganisationDepartmentModels = CopyOfOrganisationDepartmentModel.GetOrganisationDepartmentModels();
OrganisationView = CollectionViewSource.GetDefaultView(OrganisationModels);
DepartmentView = CollectionViewSource.GetDefaultView(DepartmentModels);
OrganisationDepartmentView = CollectionViewSource.GetDefaultView(OrganisationDepartmentModels);
Search = new OrganisationModel();
OrganisationDepartmentView.Filter = new Predicate<object>(o => Filter(o as OrganisationDepartmentModel));
}
}
private bool Filter2(DepartmentModel department)
{
List<OrganisationDepartmentModel> list = OrganisationDepartmentModels.Where(item => (Search.Id == item.OrganisationId)).ToList();
List<DepartmentModel> list2 = DepartmentModels.Where(item => item.Id == department.Id).ToList();
var result = list2.Where(item => list.Any(x => x.DepartmentId == item.Id));
return result.Any(item => item.Id != department.Id);
}
private bool Filter(DepartmentModel department)
{
return OrganisationDepartmentModels.Any(odm =>
Search == null ||
(Search.Id = odm.OrganisationId && department.Id == odm.DepartmentId));
}
private bool Filter2(DepartmentModel department)
{
List<OrganisationDepartmentModel> list = OrganisationDepartmentModels.Where(item => (Search.Id == item.OrganisationId)).ToList();
List<DepartmentModel> list2 = DepartmentModels.Where(item => item.Id == department.Id).ToList();
var combined = list2.Where(item => list.Any(x => x.DepartmentId == item.Id));
return combined.All(item => item.Id != department.Id); // Needed to do `All` instead of `Any`
}