我正在尝试为一个DataGrid创建一个弹出过滤器。我的目标是使用弹出窗口,允许用户添加多个过滤规则。我还没有完全计算出UI,但下面是一个模型。
它将提供添加带有" and“或”r“的多个规则,以及某种类型的括号图形表示(我刚刚为此绘制了一些垂直线)。

我已经启动了下面的filter类结构。其思想是有一个列定义的集合,每个列的内部都有一个对象集合,这些对象可以是单独的过滤器,也可以是过滤器的集合( FilterGroup),可能为括号提供一个层次结构。
我找出的问题是:在条件运算符“和”和“或”中如何和在什么地方适合,这也是提供括号和聚合的好方法。期待您的建议和建议。
static class SomeStaticClass
{
static List<PropertyFilter> PropertyFilters = new List<PropertyFilter>();
}
public class PropertyFilter
{
string PropertyName = "";
Type PorpertyType = null;
DataGridColumn ColumnType = null;
List<object> FilterCollection = new List<object>();
}
public enum ComparisonOperator
{
Equals,
Contains,
StartsWith,
EndsWith
}
public enum ConditionalOperator
{
And,
Or
}
public class FilterGroup
{
List<object> FilterCollection = new List<object>();
}
public class Filter
{
ComparisonOperator op_comp;
string value;
bool matchCase;
}发布于 2014-07-10 04:26:39
我试图创建一个类似的过滤器,具有无限深度的过滤器和组。

类
namespace CSharpWPF
{
public abstract class BaseFilter
{
//public abstract bool ApplyFilter();
}
public class PropertyFilter : BaseFilter
{
public string PropertyName { get; set; }
public Type PropertyType { get; set; }
public ConditionalOperator Operator { get; set; }
public Filter Filter { get; set; }
}
public class FilterGroup : BaseFilter
{
public FilterGroup()
{
Filters = new List<BaseFilter>();
}
public ConditionalOperator? Operator { get; set; }
public List<BaseFilter> Filters { get; set; }
}
public enum ComparisonOperator
{
Equals,
Contains,
StartsWith,
EndsWith
}
public enum ConditionalOperator
{
And,
Or
}
public class Filter
{
public ComparisonOperator Operator { get; set; }
public string Value { get; set; }
public bool MatchCase { get; set; }
}
}xaml
<ScrollViewer>
<StackPanel>
<ContentControl xmlns:l="clr-namespace:CSharpWPF"
Content="{Binding Filter}">
<ContentControl.Resources>
<ObjectDataProvider x:Key="operators"
MethodName="GetValues"
ObjectType="{x:Type sys:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="l:ConditionalOperator" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<DataTemplate DataType="{x:Type l:PropertyFilter}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"
SharedSizeGroup="name" />
<ColumnDefinition Width="auto"
SharedSizeGroup="match" />
<ColumnDefinition />
<ColumnDefinition Width="auto"
SharedSizeGroup="button" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding PropertyName}"
Margin="2" />
<CheckBox IsChecked="{Binding Filter.MatchCase}"
VerticalAlignment="Center"
Content="Aa"
Margin="2"
Grid.Column="1" />
<TextBox Text="{Binding Filter.Value}"
Grid.Column="2"
Margin="2" />
<Button Content="X"
Padding="0"
Grid.Column="3"
Margin="2" />
</Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type l:FilterGroup}">
<Border BorderBrush="DarkGreen"
BorderThickness="4,1,1,1"
Margin="4,1,1,1"
Padding="2">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ComboBox x:Name="operator"
SelectedItem="{Binding Operator}"
VerticalAlignment="Center"
Margin="2"
ItemsSource="{Binding Source={StaticResource operators}}" />
<ItemsControl ItemsSource="{Binding Filters}"
Grid.IsSharedSizeScope="True"
Grid.Column="1" />
</Grid>
</Border>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Operator}"
Value="{x:Null}">
<Setter TargetName="operator"
Property="Visibility"
Value="Collapsed" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</StackPanel>
</ScrollViewer>样本代码
public ViewModel()
{
Filter = new FilterGroup();
Filter.Filters.Add(new PropertyFilter() { PropertyName = "Text", PropertyType = typeof(string) });
FilterGroup group = new FilterGroup() { Operator = ConditionalOperator.And };
group.Filters.Add(new PropertyFilter() { PropertyName = "Text2", PropertyType = typeof(string) });
group.Filters.Add(new PropertyFilter() { PropertyName = "Text3", PropertyType = typeof(string) });
Filter.Filters.Add(group);
group = new FilterGroup() { Operator = ConditionalOperator.Or };
group.Filters.Add(new PropertyFilter() { PropertyName = "Text4", PropertyType = typeof(string) });
group.Filters.Add(new PropertyFilter() { PropertyName = "Text5", PropertyType = typeof(string) });
FilterGroup subGroup = new FilterGroup() { Operator = ConditionalOperator.Or };
subGroup.Filters.Add(new PropertyFilter() { PropertyName = "Text8", PropertyType = typeof(string) });
subGroup.Filters.Add(new PropertyFilter() { PropertyName = "Text9", PropertyType = typeof(string) });
group.Filters.Add(subGroup);
Filter.Filters.Add(group);
Filter.Filters.Add(new PropertyFilter() { PropertyName = "Text6", PropertyType = typeof(string) });
Filter.Filters.Add(new PropertyFilter() { PropertyName = "Text7", PropertyType = typeof(string) });
}
public FilterGroup Filter { get; set; }你可以根据你的需要调整每件事。
https://stackoverflow.com/questions/24666380
复制相似问题