Summary
Have managed to develop the following output:
Explanation
Code
XAML
<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>
OrganisationModel
public class OrganisationModel
{
public int Id { get; set; }
public string OrganisationName { get; set; }
public ObservableCollection<OrganisationModel> GetOrganisationModels()
{
ObservableCollection<OrganisationModel> organisationModel = new ObservableCollection<OrganisationModel>();
organisationModel.Add(new OrganisationModel { Id = 1, OrganisationName = "Organisation 1" });
organisationModel.Add(new OrganisationModel { Id = 2, OrganisationName = "Organisation 2" });
organisationModel.Add(new OrganisationModel { Id = 3, OrganisationName = "Organisation 3" });
organisationModel.Add(new OrganisationModel { Id = 4, OrganisationName = "Organisation 4" });
organisationModel.Add(new OrganisationModel { Id = 5, OrganisationName = "Organisation 5" });
return organisationModel;
}
}
Department Model
public class DepartmentModel
{
public int Id { get; set; }
public string DepartmentName { get; set; }
public ObservableCollection<DepartmentModel> GetDepartmentModels()
{
ObservableCollection<DepartmentModel> departmentModels = new ObservableCollection<DepartmentModel>();
departmentModels.Add(new DepartmentModel { Id = 1, DepartmentName = "Department 1" });
departmentModels.Add(new DepartmentModel { Id = 2, DepartmentName = "Department 2" });
departmentModels.Add(new DepartmentModel { Id = 3, DepartmentName = "Department 3" });
return departmentModels;
}
}
OrganisationDepartmentModel
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;
}
}
ViewModel
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));
}
}
Goal
I am aiming to apply a Filter to the Department
DataGrid on the bottom left corner. The filter should work as follows:
- Select an Organisation in top-left datagrid.
- Top-right datagrid is then filtered to show selected organisation by
id
number. (This works) - On top of that, filter
Department
datagrid on bottom-left corner. Only show Departments that are not listed in the top right datagrid.
Question
How can I implement this dynamic filter?
What I have tried
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);
}
This does not return any values.