Wpf Xceed DataGrid:筛选详细信息

Wpf Xceed DataGrid:筛选详细信息,wpf,filter,datagrid,master-detail,xceed,Wpf,Filter,Datagrid,Master Detail,Xceed,我有一个主/细节数据网格,我想过滤细节。 以下是我的DataGridCollectionViewSource: <xcdg:DataGridCollectionViewSource x:Key="Features" Filter="ExampleFilter" Source="{Bindin

我有一个主/细节数据网格,我想过滤细节。 以下是我的DataGridCollectionViewSource:

            <xcdg:DataGridCollectionViewSource x:Key="Features" 
                                            Filter="ExampleFilter"
                                            Source="{Binding Path=ItemUnderEdit.Features}"
                                            AutoCreateDetailDescriptions="False" 
                                            AutoCreateItemProperties="False">   
            <xcdg:DataGridCollectionViewSource.DetailDescriptions>
                <xcdg:PropertyDetailDescription RelationName="Settings"
                                                AutoCreateDetailDescriptions="False"
                                                AutoCreateItemProperties="False">
                </xcdg:PropertyDetailDescription>
            </xcdg:DataGridCollectionViewSource.DetailDescriptions>
        </xcdg:DataGridCollectionViewSource>

正如你所看到的,我用ExampleFilter对其进行过滤,但这只过滤主文件。我设置了一个断点,它从未看到任何细节


我不能以相同的方式将过滤器添加到详细说明中。有没有办法过滤这些细节?任何帮助都将不胜感激

我今天遇到了这个问题-我有一个简单的过滤器,可以通过代码打开/关闭主部分和详细部分。对于master部分,这是一个简单的代码问题,如:

((DataGridCollectionView)grid.ItemsSource).FilterCriteriaMode = FilterCriteriaMode.None; // Off
((DataGridCollectionView)grid.ItemsSource).FilterCriteriaMode = FilterCriteriaMode.And; // On
((DataGridCollectionView)grid.ItemsSource).Refresh(); // Re-run filter.
对于细节部分,它应该像下面的代码一样简单(但不是):

事实证明,这样做将为生成的任何新细节部分启用新过滤器,但不会启用现有部分。展开主行时将生成新的详图剖面。为了解决这个问题,我需要一个简单的foreach循环,例如:

foreach (DataGridContext context in grid.GetChildContexts()) {
    ((DataGridCollectionViewBase)(context.Items)).FilterCriteriaMode = PetsDetailDescriptions.FilterCriteriaMode;
}
以下是我的完整(ish)代码:

public bool ShowDeleted {
    set {
        if ((grid.ItemsSource != null) && (grid.ItemsSource.GetType() == DataGridCollectionView));
            DataGridCollectionView v = ((DataGridCollectionView)(grid.ItemsSource));
            if (value) {
                v.FilterCriteriaMode = FilterCriteriaMode.None;
                MyDetailDescription.FilterCriteriaMode = FilterCriteriaMode.None;
            }
            else {
                v.FilterCriteriaMode = FilterCriteriaMode.And;
                MyDetailDescription.FilterCriteriaMode = FilterCriteriaMode.And;
            }

            foreach (DataGridContext context in grid.GetChildContexts()) {
                ((DataGridCollectionViewBase)(context.Items)).FilterCriteriaMode = PetsDetailDescriptions.FilterCriteriaMode;
            }
            v.Refresh();
        }

    }
}
我将它与XAML中一个简单的预定义过滤条件结合使用。即:

        <g:DataGridItemProperty Name="IsDeleted"
                                DataType="{x:Type sys:Boolean}">
            <g:DataGridItemProperty.FilterCriterion>
                <g:EqualToFilterCriterion>
                    <sys:Boolean>False</sys:Boolean>
                </g:EqualToFilterCriterion>
            </g:DataGridItemProperty.FilterCriterion>
        </g:DataGridItemProperty>

假的
我建议使用Xaml FilterCriterions,因为如果您确实需要Filter事件,它会变得有点混乱。对于该路线,您需要执行以下步骤:

  • 在控件中添加新的子DataGridContext时点击事件
  • 向context.Items.Filter属性添加谓词引用(在代码状态下,这是一个属性,需要谓词,而不是事件)
  • 在谓词函数中编写过滤代码
  • 我不能100%确定如何实现上面的#1(因为我不需要走这条路)。但是,可以从DataGridControl的DetailsExpanding和DetailsExpanded事件开始。对于扩展,我不确定子DataGridContext是否存在(因为有一个取消扩展的选项)。因此,您可能必须等到扩展事件之后

    我希望这能帮你指明正确的方向

            <g:DataGridItemProperty Name="IsDeleted"
                                    DataType="{x:Type sys:Boolean}">
                <g:DataGridItemProperty.FilterCriterion>
                    <g:EqualToFilterCriterion>
                        <sys:Boolean>False</sys:Boolean>
                    </g:EqualToFilterCriterion>
                </g:DataGridItemProperty.FilterCriterion>
            </g:DataGridItemProperty>