首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建用于DataGrid的过滤器类结构

创建用于DataGrid的过滤器类结构
EN

Stack Overflow用户
提问于 2014-07-10 02:04:23
回答 1查看 488关注 0票数 1

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

它将提供添加带有" and“或”r“的多个规则,以及某种类型的括号图形表示(我刚刚为此绘制了一些垂直线)。

我已经启动了下面的filter类结构。其思想是有一个列定义的集合,每个列的内部都有一个对象集合,这些对象可以是单独的过滤器,也可以是过滤器的集合( FilterGroup),可能为括号提供一个层次结构。

我找出的问题是:在条件运算符“和”和“或”中如何和在什么地方适合,这也是提供括号和聚合的好方法。期待您的建议和建议。

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-10 04:26:39

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

代码语言:javascript
复制
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

代码语言:javascript
复制
<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>

样本代码

代码语言:javascript
复制
    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; }

你可以根据你的需要调整每件事。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24666380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档