我有一个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 过滤它,但这只会过滤主设备。我提出了一个断点,它从未看到任何细节。
我无法以相同的方式向细节描述添加过滤器。有没有办法过滤细节?任何帮助将不胜感激!
答案 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事件,它将变得更加混乱。对于该路由,您需要执行以下步骤:
我不确定100%如何实现上述第一名(因为我不需要走那条路)。但是,可以开始的一个好地方是DataGridControl的DetailsExpanding和DetailsExpanded事件。对于扩展,我不确定子DataGridContext是否存在(因为可以取消扩展)。因此,您可能必须等到扩展事件结束后。
我希望这可以帮助您指出正确的方向。