Browse Source

Add FilterableGridViewColumn.

pull/1716/head
Siegfried Pammer 7 years ago
parent
commit
dfd5a5f3de
  1. 112
      ILSpy/Controls/FilterableGridViewColumn.cs
  2. 1
      ILSpy/ILSpy.csproj
  3. 41
      ILSpy/themes/generic.xaml

112
ILSpy/Controls/FilterableGridViewColumn.cs

@ -0,0 +1,112 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Media;
namespace ICSharpCode.ILSpy.Controls
{
class FilterableGridViewColumn : SortableGridViewColumn
{
static readonly ComponentResourceKey headerTemplateKey = new ComponentResourceKey(typeof(FilterableGridViewColumn), "ColumnHeaderTemplate");
public FilterableGridViewColumn()
{
this.SetValueToExtension(HeaderTemplateProperty, new DynamicResourceExtension(headerTemplateKey));
}
string filterBy;
public string FilterBy {
get { return filterBy; }
set {
if (filterBy != value) {
filterBy = value;
OnPropertyChanged(new PropertyChangedEventArgs("FilterBy"));
}
}
}
string filterFormatString;
public string FilterFormatString {
get { return filterFormatString; }
set {
if (filterFormatString != value) {
filterFormatString = value;
OnPropertyChanged(new PropertyChangedEventArgs("FilterFormatString"));
}
}
}
public static ListView GetParentView(DependencyObject obj)
{
return (ListView)obj.GetValue(ParentViewProperty);
}
public static void SetParentView(DependencyObject obj, ListView value)
{
obj.SetValue(ParentViewProperty, value);
}
public static readonly DependencyProperty ParentViewProperty =
DependencyProperty.RegisterAttached("ParentView", typeof(ListView), typeof(FilterableGridViewColumn), new PropertyMetadata(null));
public string FilterExpression {
get { return (string)GetValue(FilterExpressionProperty); }
set { SetValue(FilterExpressionProperty, value); }
}
public static readonly DependencyProperty FilterExpressionProperty =
DependencyProperty.Register("FilterExpression", typeof(string), typeof(FilterableGridViewColumn), new PropertyMetadata(null, OnFilterExpressionChanged));
private static void OnFilterExpressionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var header = d as FilterableGridViewColumn;
var view = GetParentView(header);
if (header == null || view == null)
return;
header.Filter(view, e.NewValue as string);
}
void Filter(ListView grid, string filterExpression)
{
ColumnSortDirection currentDirection = GetSortDirection(grid);
ICollectionView dataView = CollectionViewSource.GetDefaultView(grid.ItemsSource);
if (dataView == null) return;
string filterBy = FilterBy;
if (filterBy == null) {
Binding binding = DisplayMemberBinding as Binding;
if (binding != null && binding.Path != null) {
filterBy = binding.Path.Path;
}
}
dataView.Filter = delegate (object item) {
if (filterBy == null)
return true;
var pInfo = item.GetType().GetProperty(filterBy);
if (pInfo == null)
return false;
return Matches(filterExpression, string.Format("{0:" + FilterFormatString + "}", pInfo.GetValue(item)));
};
dataView.Refresh();
}
bool Matches(string filterExpression, string value)
{
return value?.Contains(filterExpression) == true;
}
}
}

1
ILSpy/ILSpy.csproj

@ -116,6 +116,7 @@
<Compile Include="Controls\CustomDialog.cs"> <Compile Include="Controls\CustomDialog.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>
<Compile Include="Controls\FilterableGridViewColumn.cs" />
<Compile Include="Controls\GridViewColumnAutoSize.cs" /> <Compile Include="Controls\GridViewColumnAutoSize.cs" />
<Compile Include="Controls\MarkupExtensions.cs" /> <Compile Include="Controls\MarkupExtensions.cs" />
<Compile Include="Controls\ResourceObjectTable.xaml.cs"> <Compile Include="Controls\ResourceObjectTable.xaml.cs">

41
ILSpy/themes/generic.xaml

@ -10,7 +10,7 @@
Displays an up arrow or down arrow in the column header when the grid is sorted using that column. Displays an up arrow or down arrow in the column header when the grid is sorted using that column.
--> -->
<controls:ColumnSortDirectionToVisibilityConverter x:Key="ColumnSortDirectionToVisibilityConverter"/> <controls:ColumnSortDirectionToVisibilityConverter x:Key="ColumnSortDirectionToVisibilityConverter"/>
<DataTemplate x:Key="{ComponentResourceKey {x:Type controls:SortableGridViewColumn}, ColumnHeaderTemplate}"> <DataTemplate x:Key="{ComponentResourceKey {x:Type controls:SortableGridViewColumn}, ColumnHeaderTemplate}">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<TextBlock HorizontalAlignment="Center" Text="{Binding}"/> <TextBlock HorizontalAlignment="Center" Text="{Binding}"/>
@ -26,6 +26,45 @@
Data = "M 5,5 L 10,10 L 15,5 L 5,5"/> Data = "M 5,5 L 10,10 L 15,5 L 5,5"/>
</StackPanel> </StackPanel>
</DataTemplate> </DataTemplate>
<DataTemplate x:Key="{ComponentResourceKey {x:Type controls:FilterableGridViewColumn}, ColumnHeaderTemplate}">
<StackPanel Orientation="Horizontal">
<TextBlock HorizontalAlignment="Center" Text="{Binding}"/>
<Path x:Name="upArrow"
Visibility="{Binding Path=Column.SortDirection, ConverterParameter={x:Static controls:ColumnSortDirection.Ascending}, RelativeSource={RelativeSource AncestorType={x:Type GridViewColumnHeader}}, Converter={StaticResource ColumnSortDirectionToVisibilityConverter}}"
StrokeThickness = "1"
Fill = "Gray"
Data = "M 5,10 L 15,10 L 10,5 L 5,10"/>
<Path x:Name="downArrow"
Visibility="{Binding Path=Column.SortDirection, ConverterParameter={x:Static controls:ColumnSortDirection.Descending}, RelativeSource={RelativeSource AncestorType={x:Type GridViewColumnHeader}}, Converter={StaticResource ColumnSortDirectionToVisibilityConverter}}"
StrokeThickness = "1"
Fill = "Gray"
Data = "M 5,5 L 10,10 L 15,5 L 5,5"/>
<CheckBox x:Name="isFilterOpen">
<CheckBox.Template>
<ControlTemplate TargetType="CheckBox">
<Path x:Name="filterSymbol"
StrokeThickness="1"
Fill="Gray"
Data="M 0,0L 20,0L 14,6L 14,12L 6,12L 6,6L 0,0"/>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="filterSymbol" Property="Fill" Value="Gray"/>
<Setter TargetName="filterSymbol" Property="Stroke" Value="Transparent"/>
</Trigger>
<Trigger Property="IsChecked" Value="False">
<Setter TargetName="filterSymbol" Property="Fill" Value="Transparent"/>
<Setter TargetName="filterSymbol" Property="Stroke" Value="Gray"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</CheckBox.Template>
</CheckBox>
<Popup StaysOpen="True" Placement="Top" HorizontalOffset="16" IsOpen="{Binding IsChecked, ElementName=isFilterOpen}">
<TextBox x:Name="filter" Height="24" Width="100" Text="{Binding Path=Column.FilterExpression, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType={x:Type GridViewColumnHeader}}}" />
</Popup>
</StackPanel>
</DataTemplate>
<SolidColorBrush x:Key="paneBorder" Color="#828790" /> <SolidColorBrush x:Key="paneBorder" Color="#828790" />

Loading…
Cancel
Save