One thing that i like of WPF is the possibility of making easy-to-use controls to manage data.
A control that i use a lot of times to filter dataviews, charts, get queryes parameters and so on is a listbox of checkbox.
This isn't that special, but with ICollectionView and the possibility of having a fast way to filter results like the search box in google.com it become a really powerful tool.
I invite you to download the demo (link at the bottom of this page) to understand better.
Let's start from an example:
I have an observable collection of "Fruits", objects that contain a property "Name" and a property "Show" that indicates if the object has to be visualized or filtered.
To filter this collection i can use the ICollectionView, that permits to filter a collection and has a method Refresh() that reload the collection with the filter parameters.
So in the properties i add:
class MyFruitCollection : ObservableCollection
{
private ICollectionView filteredCollection;
public ICollectionView FilteredCollection { get { return filteredCollection; } }
and the filter string:
private string filter = "";
public string Filter
{
get { return this.filter.ToUpperInvariant(); }
set
{
if (this.filter != value)
{
this.filter = value;
this.filteredCollection.Refresh(); //Notice that i call Refresh() at every change of filter
}
}
}
In the constructor of my collection i add some fruits(just for example) and i load the ICollectionView datasource:
public MyFruitCollection()
{
this.Add(new MyFruit("Orange"));
...
this.Add(new MyFruit("Watermelon"));
this.filteredCollection = CollectionViewSource.GetDefaultView(this);
this.filteredCollection.Filter = ContainsFilter;
}
Then i set the filters on this method:
private bool ContainsFilter(object item)
{
var fruit = item as MyFruit;
if (fruit == null) //check if fruit is null
{
return false;
}
if (string.IsNullOrEmpty(this.Filter)) //check if search box is empty or null
{
return true; //show all items if there is no text in the search textbox
}
if (fruit.Name.ToUpperInvariant().Contains(this.Filter)) //checks if fruit.name contains the search text
{
return true;
}
return false; //if it doesn't contain anything don't show the item
}
Xaml is pretty simple, as usual it's all about databinding:
And this is the code behind:
public partial class MainWindow : Window
{
MyFruitCollection fruitCollection = new MyFruitCollection();
public MainWindow()
{
InitializeComponent();
this.DataContext = fruitCollection; //notice that all the application is in binding
}
...
}
The resul is pretty cool and it makes apps a lot more confortable, just try yourself :)
Download the example here:
http://mesta-automation.com/Downloads/Selection%20control.rar
A control that i use a lot of times to filter dataviews, charts, get queryes parameters and so on is a listbox of checkbox.
This isn't that special, but with ICollectionView and the possibility of having a fast way to filter results like the search box in google.com it become a really powerful tool.
I invite you to download the demo (link at the bottom of this page) to understand better.
Let's start from an example:
I have an observable collection of "Fruits", objects that contain a property "Name" and a property "Show" that indicates if the object has to be visualized or filtered.
To filter this collection i can use the ICollectionView, that permits to filter a collection and has a method Refresh() that reload the collection with the filter parameters.
So in the properties i add:
class MyFruitCollection : ObservableCollection
{
private ICollectionView filteredCollection;
public ICollectionView FilteredCollection { get { return filteredCollection; } }
and the filter string:
private string filter = "";
public string Filter
{
get { return this.filter.ToUpperInvariant(); }
set
{
if (this.filter != value)
{
this.filter = value;
this.filteredCollection.Refresh(); //Notice that i call Refresh() at every change of filter
}
}
}
In the constructor of my collection i add some fruits(just for example) and i load the ICollectionView datasource:
public MyFruitCollection()
{
this.Add(new MyFruit("Orange"));
...
this.Add(new MyFruit("Watermelon"));
this.filteredCollection = CollectionViewSource.GetDefaultView(this);
this.filteredCollection.Filter = ContainsFilter;
}
Then i set the filters on this method:
private bool ContainsFilter(object item)
{
var fruit = item as MyFruit;
if (fruit == null) //check if fruit is null
{
return false;
}
if (string.IsNullOrEmpty(this.Filter)) //check if search box is empty or null
{
return true; //show all items if there is no text in the search textbox
}
if (fruit.Name.ToUpperInvariant().Contains(this.Filter)) //checks if fruit.name contains the search text
{
return true;
}
return false; //if it doesn't contain anything don't show the item
}
Xaml is pretty simple, as usual it's all about databinding:
And this is the code behind:
public partial class MainWindow : Window
{
MyFruitCollection fruitCollection = new MyFruitCollection();
public MainWindow()
{
InitializeComponent();
this.DataContext = fruitCollection; //notice that all the application is in binding
}
...
}
The resul is pretty cool and it makes apps a lot more confortable, just try yourself :)
Download the example here:
http://mesta-automation.com/Downloads/Selection%20control.rar