This is a migrated thread and some comments may be shown as answers.

Filter RadListView based on ToggleButton in separate list

6 Answers 66 Views
ListView
This is a migrated thread and some comments may be shown as answers.
George
Top achievements
Rank 1
George asked on 15 Sep 2017, 02:33 PM
I have a listview for my data feeds items.  Each item in the listview will either have a togglebutton or a listviewcheckbox bound to a IsEnabled property on the listview item object.  I want to filter the items in a separate RadListView based on the IsEnabled property in the main listview.  Are there any examples that show how to do something similar to this?

6 Answers, 1 is accepted

Sort by
0
Lance | Manager Technical Support
Telerik team
answered on 18 Sep 2017, 04:29 PM
Hello George,

The fact you're going to filter from another ListView isn't relevant, just assign a filter as you'd normally do. Let me explain.

You can set up RadListView filtering/grouping programmatically in any button click event handler as long as there is a reference available to the RadListView you want the filter to be applied to. You can find a list of the available FilterDescriptors here (use delegate option if you wan custom filtering).

For a simple example, if I wanted to filter a list of emails by the IsRead property, you do this

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    EmailListView.FilterDescriptors.Add(new BooleanFilterDescriptor { PropertyName = "IsRead", Value = true });
}

and to remove the filter, just do this:

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    EmailListView.FilterDescriptors.Clear();
}


As far as using a ToggleButton to determine whether or not to use the filter, you have access to the ToggleButton's IsChecked value in it's Click event or use the individual Checked and Unchecked event.


private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    var button = sender as ToggleButton;
 
    if (button.IsChecked.Value)
    {
        EmailListView.FilterDescriptors.Add(new BooleanFilterDescriptor()
        {
           PropertyName = "IsRead", Value = true
        });
    }
    else
    {
        EmailListView.FilterDescriptors.Clear();
    }
}


Demo


I've attached a demo to get you started on how you could do it from another RadListView, in it I use a TextFilter Descriptor to filter the emails.

I do something special in the demo that what I've shown above. Instead of removing all of the filters every time one button is untoggled, loop through and remove the individual filter.

Adding filter in OnChecked

private void ToggleButton_OnChecked(object sender, RoutedEventArgs e)
{
    // if button is null, return
    if (!(sender is ToggleButton button)) return;
 
    EmailListView.FilterDescriptors.Add(new TextFilterDescriptor
    {
        IsCaseSensitive = false,
        PropertyName = "Sender", // this is the property name on the bound model
        Value = button.DataContext as string
    });
}


Remove specific filter in OnUnchecked

private void ToggleButton_OnUnchecked(object sender, RoutedEventArgs e)
{
    // OPTION! - If you want to just clear the filter, instead of finding a specific filter, then just do this:
    //EmailListView.FilterDescriptors.Clear();
             
    // OPTION 2 - If you only want to remove one specific filter, location it and remove it specifically
 
    // If button is null, return
    if (!(sender is ToggleButton button)) return;
 
    // Loop through the filters
    for (var index = 0; index < EmailListView.FilterDescriptors.Count; index++)
    {
        FilterDescriptorBase filter = EmailListView.FilterDescriptors[index];
 
        // check and cast filter as a TextfilterDescriptor
        if ((string) (filter as TextFilterDescriptor)?.Value == button.DataContext as string)
        {
            // If there's a match, then remove that filter
            EmailListView.FilterDescriptors.Remove(filter);
        }
    }
}


Here is the result at runtime:





Wrapping Up


The concept of clicking a button in a DataTemplate is same for plain UWP controls, therefore you can move forward as you normally would. The key takeaway is that you add or remove FilterDescriptors from the RadListView you want to filter on.

Regards,
Lance | Tech Support Engineer, Sr.
Progress Telerik
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
0
George
Top achievements
Rank 1
answered on 19 Sep 2017, 03:38 PM
Although this example does help, to clarify, I need to hide certain items in the list not display one item in the list.
0
George
Top achievements
Rank 1
answered on 19 Sep 2017, 03:46 PM
Also, to be more specific I have a listview of RSS feeds with a separate listview for the articles.  The listview for the RSS feeds has a toggle button to turn them off and on.  I would only like to display articles if the RSS feed is on (IsEnabled = true).
0
George
Top achievements
Rank 1
answered on 19 Sep 2017, 08:06 PM

Ok, I think I'm closer.  I added an IsEnabled boolean property to the class bound to the RadListView.  I then added the following XAML"

                        <data:RadListView.FilterDescriptors>
                            <core:BooleanFilterDescriptor PropertyName="IsEnabled" Value="true"/>
                        </data:RadListView.FilterDescriptors>

However, I'm not seeing data being dynamically filtered if the value of IsEnabled changes.

0
George
Top achievements
Rank 1
answered on 19 Sep 2017, 08:28 PM
My bindings were off.  Got it all working.  Thanks for your assistance!
0
Lance | Manager Technical Support
Telerik team
answered on 19 Sep 2017, 11:01 PM
Hello George,

Sorry I couldn't get to your case earlier, I'm happy to see you are up and running! 

Additional Note:

There may be some things to watch out for, such as making sure that only one filter is toggled so that the use doesn't have to click the toggle button twice, but that stuff you'll end up seeing as you go through deploy > test cycles.

The fix for something like that would be to iterate over the items and change the bound property for the toggle button to false, before setting the true value on the item you want filtered.

You should be good to go from here, but let me know if you have any further trouble.

Regards,
Lance | Tech Support Engineer, Sr.
Progress Telerik
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
Tags
ListView
Asked by
George
Top achievements
Rank 1
Answers by
Lance | Manager Technical Support
Telerik team
George
Top achievements
Rank 1
Share this question
or