Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建用于DataGrid的筛选器类结构_C#_Wpf_Datagrid_Filtering - Fatal编程技术网

C# 创建用于DataGrid的筛选器类结构

C# 创建用于DataGrid的筛选器类结构,c#,wpf,datagrid,filtering,C#,Wpf,Datagrid,Filtering,我正在尝试为DataGrid创建一个弹出过滤器。我的目标是使用一个弹出窗口,允许用户添加多个过滤规则。我还没有完全弄清楚UI,但下面是一个模型 它将提供添加多个带有“And”或“Ör”的规则以及一些括号的图形表示(我刚刚为此画了一些垂直线) 我已经开始了下面的过滤器类结构。其思想是有一个列定义集合,在每个定义中有一个对象集合,这些对象可以是单个过滤器或过滤器集合(FilterGroup),可能为括号提供层次结构 我很难弄清楚的一点是:如何以及在何处使用条件运算符“and”和“Or”,这也是提供

我正在尝试为DataGrid创建一个弹出过滤器。我的目标是使用一个弹出窗口,允许用户添加多个过滤规则。我还没有完全弄清楚UI,但下面是一个模型

它将提供添加多个带有“And”或“Ör”的规则以及一些括号的图形表示(我刚刚为此画了一些垂直线)

我已经开始了下面的过滤器类结构。其思想是有一个列定义集合,在每个定义中有一个对象集合,这些对象可以是单个过滤器或过滤器集合(FilterGroup),可能为括号提供层次结构

我很难弄清楚的一点是:如何以及在何处使用条件运算符“and”和“Or”,这也是提供括号和聚合的好方法。期待您的建议和建议

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;
}
static类SomeStaticClass
{
静态列表属性过滤器=新列表();
}
公共类属性过滤器
{
字符串PropertyName=“”;
类型PorpertyType=null;
DataGridColumn ColumnType=null;
List FilterCollection=新列表();
}
公共枚举比较运算符
{
等于,
包含,
开始,
EndsWith
}
公共枚举条件运算符
{
以及,
或
}
公共类筛选器组
{
List FilterCollection=新列表();
}
公共类过滤器
{
比较运算器;
字符串值;
布尔火柴盒;
}

我试图创建一个具有无限深度的过滤器和组的类似过滤器

班级

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; }
    }
}

您可以根据需要调整一切

这是一个巨大的挑战,我会尽力为您准备一些东西。
<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; }