Xceed DataGrid:过滤详细信息

时间:2018-01-23 15:37:19

标签: wpf filter datagrid master-detail xceed

我有一个Master / Detail DataGrid,我想过滤细节。 这是我的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 过滤它,但这只会过滤主设备。我提出了一个断点,它从未看到任何细节。

我无法以相同的方式向细节描述添加过滤器。有没有办法过滤细节?任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

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

((DataGridCollectionView)grid.ItemsSource).FilterCriteriaMode = FilterCriteriaMode.None; // Off
((DataGridCollectionView)grid.ItemsSource).FilterCriteriaMode = FilterCriteriaMode.And; // On
((DataGridCollectionView)grid.ItemsSource).Refresh(); // Re-run filter.

对于详细信息部分,它应该像以下代码一样简单(不是):

MyDetailDescription.FilterCriteriaMode = FilterCriteriaMode.None; // Off
MyDetailDescription.FilterCriteriaMode = FilterCriteriaMode.And; // On

结果证明,这样做将为生成的所有新详细信息部分启用新过滤器,而不是现有的。展开主行时,将生成新的详细信息节。为了解决这个问题,事实证明我需要一个简单的foreach循环,例如:

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

这是我完整的代码:

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中将其与简单的预定义过滤条件结合使用。 IE:

        <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事件,它将变得更加混乱。对于该路由,您需要执行以下步骤:

  1. 将新的子DataGridContext添加到控件中时,请使用事件。
  2. 添加对context.Items.Filter属性的谓词引用(在代码状态下,这是一个期望谓词的属性,而不是事件)。
  3. 在谓词函数中编写过滤器代码。

我不确定100%如何实现上述第一名(因为我不需要走那条路)。但是,可以开始的一个好地方是DataGridControl的DetailsExpanding和DetailsExpanded事件。对于扩展,我不确定子DataGridContext是否存在(因为可以取消扩展)。因此,您可能必须等到扩展事件结束后。

我希望这可以帮助您指出正确的方向。