Infragistics XamTreeGrid - Как узнать, когда фильтрация завершена - PullRequest
0 голосов
/ 01 ноября 2018

В настоящее время я использую 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...