Reputation: 289
I have a filter functionality in place for my application which uses checkboxes to filter out certain observable collection items bound to a datagrid. I do not get an error at all, the filter just does not function like I want it to. Here's the xaml code for it:
<Window.Resources>
<CollectionViewSource x:Key="jobItemViewSource" d:DesignSource="{d:DesignInstance my:JobItem, CreateList=True}"/>
</Window.Resources>
<!--
Irrelevant Content
-->
<CheckBox Content="Show Active Jobs" Name="actJobsCheckBox" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="3" HorizontalAlignment="Center" VerticalAlignment="Center" Checked="AddAFiltering" Unchecked="RemoveAFiltering" />
<CheckBox Content="Show Completed Jobs" Name="compJobsCheckBox" Grid.Column="3" Grid.ColumnSpan="3" Grid.Row="3" HorizontalAlignment="Center" VerticalAlignment="Center" Checked="AddCFiltering" Unchecked="RemoveCFiltering"/>
<DataGrid Grid.Row="4" Grid.ColumnSpan="6" LoadingRow="jobItemDataGrid_LoadingRow" ItemsSource="{Binding}" Name="jobItemDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" IsReadOnly="True" IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False" Grid.RowSpan="2">
<DataGrid.Columns>
<DataGridTextColumn x:Name="workOrderNoColumn" Binding="{Binding Path=WorkOrderNo}" Header="Work Order No." Width="75" />
<DataGridTextColumn x:Name="assigneeColumn" Binding="{Binding Path=PrimaryAssignee}" Header="Assignee" Width="80" />
<DataGridTextColumn x:Name="dateReceivedColumn" Binding="{Binding Path=DateReceived}" Header="Date Received" Width="90" />
<DataGridTextColumn x:Name="dueDateColumn" Binding="{Binding Path=DueDate}" Header="Due Date" Width="90" />
<DataGridTextColumn x:Name="statusColumn" Binding="{Binding Path=Status}" Header="Status" Width="70" />
</DataGrid.Columns>
</DataGrid>
Then here is what I've written for the code behind:
public AdminView(Employee currEmployee)
{
this.Title = "Administrator View - " + currEmployee.Name;
InitializeComponent();
jobItemDataGrid.DataContext = JobItemList;
jobItemViewSource = (CollectionViewSource)(this.Resources["jobItemViewSource"]);
LoadDummies();
}
private void AddAFiltering(object sender, RoutedEventArgs args)
{
jobItemViewSource.Filter += new FilterEventHandler(ActiveJobs_Filter);
}
private void RemoveAFiltering(object sender, RoutedEventArgs args)
{
jobItemViewSource.Filter -= new FilterEventHandler(ActiveJobs_Filter);
}
private void AddCFiltering(object sender, RoutedEventArgs args)
{
jobItemViewSource.Filter += new FilterEventHandler(CompletedJobs_Filter);
}
private void RemoveCFiltering(object sender, RoutedEventArgs args)
{
jobItemViewSource.Filter -= new FilterEventHandler(CompletedJobs_Filter);
}
private void ActiveJobs_Filter(object sender, FilterEventArgs e)
{
JobItem currJob = e.Item as JobItem;
if (currJob != null)
{
if (!currJob.Status.Equals("Completed"))
{
e.Accepted = true;
}
else
{
e.Accepted = false;
}
}
}
private void CompletedJobs_Filter(object sender, FilterEventArgs e)
{
JobItem currJob = e.Item as JobItem;
if (currJob != null)
{
if (currJob.Status.Equals("Completed"))
{
e.Accepted = true;
}
else
{
e.Accepted = false;
}
}
}
Upvotes: 0
Views: 1933
Reputation: 3312
I'm not sure how to fix it using your approach. But here is how I would accomplish this task. Make a property called FilteredJobItemList to bind to instead of the main list. Bind your checkboxes to properties IsActiveChecked/IsCompletedChecked. In the setters for these, raise the propertychanged event for your FilteredJobItemList.
public ObservableCollection<JobItem> FilteredJobItemList
{
get
{
if ((IsActiveChecked) && (!IsCompletedChecked))
{
return JobItemList.Where(x => x.status != "Completed");
}
else if ((!IsActiveChecked) && (IsCompletedChecked))
{
return JobItemList.Where(x => x.status == "Completed");
}
else
{
return JobItemList;
}
}
}
public bool IsActiveChecked
{
get
{
return _isActiveChecked;
}
set
{
if (value != _isActiveChecked)
{
_isActiveChecked = value;
OnPropertyChanged("IsActiveChecked");
OnPropertyChanged("FilteredJobItemList");
}
}
}
public bool IsCompletedChecked
{
get
{
return _isCompletedChecked;
}
set
{
if (value != _isCompletedChecked)
{
_isCompletedChecked = value;
OnPropertyChanged("IsCompletedChecked");
OnPropertyChanged("FilteredJobItemList");
}
}
}
Upvotes: 1