-1

Summary

Have managed to develop the following output:

enter image description here

Explanation

enter image description here

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.

Eduards
  • 1,734
  • 2
  • 12
  • 37

2 Answers2

0

Add filter to DepartamentView:

private bool Filter(DepartmentModel department)
{
    return OrganisationDepartmentModels.Any(odm =>
       Search == null ||
       (Search.Id = odm.OrganisationId && department.Id == odm.DepartmentId));
}

If the collections are large and there is a risk of lags, then transform the OrganizationDepartmentModels into a dictionary using the key- tuple (OrganizationId, DepartmentId). And use the key lookup instead of Any () - it's much faster for large collections.

EldHasp
  • 6,079
  • 2
  • 9
  • 24
0

Manage to do it now...

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`
}
Eduards
  • 1,734
  • 2
  • 12
  • 37