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. 39
      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">

39
ILSpy/themes/generic.xaml

@ -27,6 +27,45 @@
</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" />
<!-- DockedPane --> <!-- DockedPane -->

Loading…
Cancel
Save