В настоящее время я использую XamTreeGrid в своем приложении, и для свойства AllowRecordFiltering установлено значение true. Данные в XamTreeGrid - это два слоя: родительский и дочерний. Я вижу, что всякий раз, когда из выпадающего списка фильтрации в XamTreeGrid выбирается фильтр, соответствующий чему-либо на дочернем уровне, все родительские записи, соответствующие фильтру, расширяются.
Я не хочу расширять родительские записи. Это можно обойти, подписавшись на событие XamTreeGrid.RecordExpanding и установив для RecordExpandingEventArgs.Cancel значение true. Это предотвращает расширение родительских записей при фильтрации; однако это создает другую проблему: родительская запись никогда не может расширяться. Есть ли свойство, которое я могу проверить, чтобы убедиться, что XamTreeGrid завершил фильтрацию или событие, которое срабатывает, когда фильтрация завершена? Если бы это было так, у меня был бы способ лишь условно установить RecordExpandingEventArgs.Cancel в значение true, если операция фильтрации еще не завершена. Я уже пытался подписаться на события RecordFilterChanging и RecordFilterChanged, но они оба запускаются до того, как сработает событие RecordExpanding.
Я сделал простое приложение, которое воспроизводит мою проблему. Вот мое видео, воспроизводящее проблему .
Ниже приведен код простого приложения, воспроизводящего проблему.
MainWindow.xaml
<Window x:Class="TreeGrid.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TreeGrid"
xmlns:igdp="http://infragistics.com/DataPresenter"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800"
d:DataContext="{d:DesignInstance local:MainViewModel, d:IsDesignTimeCreatable=False}">
<Window.DataContext>
<local:MainViewModel />
</Window.DataContext>
<igdp:XamTreeGrid DataSource="{Binding Parents}"
RecordExpanding="OnRecordExpanding">
<igdp:XamTreeGrid.FieldLayoutSettings>
<igdp:FieldLayoutSettings AutoGenerateFields="False"
AllowFieldMoving="No"/>
</igdp:XamTreeGrid.FieldLayoutSettings>
<igdp:XamTreeGrid.ViewSettings>
<igdp:TreeViewSettings>
<igdp:TreeViewSettings.TreeLinePen>
<Pen Thickness="0" />
</igdp:TreeViewSettings.TreeLinePen>
</igdp:TreeViewSettings>
</igdp:XamTreeGrid.ViewSettings>
<igdp:XamTreeGrid.FieldSettings>
<igdp:FieldSettings AllowEdit="False"
AllowRecordFiltering="True"/>
</igdp:XamTreeGrid.FieldSettings>
<igdp:XamTreeGrid.FieldLayouts>
<igdp:FieldLayout Key="Parent">
<igdp:TextField Name="ParentNumber" />
<igdp:TextField Name="ChildNumber" BindingType="Unbound" />
<igdp:Field Name="Children" />
</igdp:FieldLayout>
<igdp:FieldLayout Key="Child" ParentFieldLayoutKey="Parent">
<igdp:TextField Name="ChildNumber" />
</igdp:FieldLayout>
</igdp:XamTreeGrid.FieldLayouts>
</igdp:XamTreeGrid>
</Window>
MainWindow.xaml.cs
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
}
private void OnRecordExpanding(object sender, RecordExpandingEventArgs e)
{
if(/* some way to know if filtering is not finished */)
{
e.Cancel = true;
return;
}
/* Rest of logic here... */
}
}
MainViewModel.cs
public class MainViewModel : ViewModelBase
{
public ObservableCollection<Parent> Parents { get; } = new ObservableCollection<Parent>();
public MainViewModel()
{
for(int i = 0; i < 10; i++)
{
var parent = new Parent(i);
for(int j = 0; j < 2; j++)
{
parent.Children.Add(new Child(j));
}
Parents.Add(parent);
}
}
}
Родитель
public class Parent : ViewModelBase
{
private int _parentNumber;
public int ParentNumber
{
get { return _parentNumber; }
set { Set(ref _parentNumber, value); }
}
public ObservableCollection<Child> Children { get; } = new ObservableCollection<Child>();
public Parent(int parentNumber)
{
ParentNumber = parentNumber;
}
}
Child.cs
public class Child : ViewModelBase
{
private int _childNumber;
public int ChildNumber
{
get { return _childNumber; }
set { Set(ref _childNumber, value); }
}
public Child(int childNumber)
{
ChildNumber = childNumber;
}
}