WPF DataGrid RowDetailsTemplate прокрутка дочерних записей

626
07 апреля 2017, 20:24

Есть следующий XAML код:

<DataGrid AutoGenerateColumns="False"
          ItemsSource="{Binding Parents}"
          RowDetailsVisibilityMode="VisibleWhenSelected"
          ScrollViewer.CanContentScroll="False">
        <DataGrid.Columns>
            <DataGridTextColumn Width="*"
                                Binding="{Binding Name}" />
        </DataGrid.Columns>
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <!-- Если IsEnabled установить в True, прокрутка для дочерних записей работать не будет  -->
                <DataGrid AutoGenerateColumns="False"
                          IsEnabled="False"
                          ItemsSource="{Binding Children}">
                    <DataGrid.Columns>
                        <DataGridTextColumn Binding="{Binding Name}" />
                    </DataGrid.Columns>
                </DataGrid>
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>
</DataGrid>

Данная таблица умеет отображать дочерние записи для каждой родительской строки. Т.е. когда мы выделяем какую-нибудь из родительских строк - в качестве деталей этой строки отображаются дочерние записи. При этом, используя колесо мыши мы можем осуществлять прокрутку (scroll) по дочерним записям.

Суть проблемы

Как можно заметить у DataGrid, который отображает дочерние записи, свойство IsEnabled установлено в False, при таких настройках прокрутка по дочерним записям с помощью колеса мыши работает. Но как только свойство IsEnabled я устанавливаю в True прокрутка с помощью колеса мыши по дочерним записям работать перестает, а нужно что бы работала.

Прошу помочь.

Answer 1

Проблема заключается в том что, когда курсор мыши находится над DataGrid с дочерними элементами и начинается прокрутка колесика мыши, то генерируется туннелируемое событие PreviewMouseWheel и для того чтобы таблица прокрутилась необходимо чтобы пришел ответ (пузырьковое событие - MouseWheel). Ответ по каким-то причинам у вас не приходит.

Решение заключается в том, чтобы перехватить событие PreviewMouseWheel и сгенерировать ответ событие - MouseWheel:

Установите "System.Windows.Interactivity v4.0 for WPF" из NuGet. Добавьте пространство имен:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

Собственно логика перехватывания и генерирования ответа при помощи Behavior:

public sealed class IgnoreMouseWheelBehavior : Behavior<UIElement>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.PreviewMouseWheel += AssociatedObject_PreviewMouseWheel;
    }
    protected override void OnDetaching()
    {
        AssociatedObject.PreviewMouseWheel -= AssociatedObject_PreviewMouseWheel;
        base.OnDetaching();
    }
    void AssociatedObject_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
    {
        e.Handled = true;
        var e2 = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
        e2.RoutedEvent = UIElement.MouseWheelEvent;
        AssociatedObject.RaiseEvent(e2);
    }
}

теперь применение:

<DataGrid AutoGenerateColumns="False"
          IsEnabled="True"
          ItemsSource="{Binding Children}">
    <i:Interaction.Behaviors>
        <local:IgnoreMouseWheelBehavior/>
    </i:Interaction.Behaviors>
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Name}" />
    </DataGrid.Columns>
</DataGrid>
READ ALSO
StringSplitOptions.RemoveEmptyEntries сразу для нескольких методов Split

StringSplitOptions.RemoveEmptyEntries сразу для нескольких методов Split

ПриветствуюМожно ли использовать перечисление StringSplitOptions

290
Отправка смс на указанный номер ASP.NET MVC 5

Отправка смс на указанный номер ASP.NET MVC 5

Допустим есть форма на сайте, в нее вбивается телефон, затем по нажатию кнопки на указанный номер отправляется сообщение

311
Получить значение из текста

Получить значение из текста

Есть текст "myservercom/?download_file=41&wccc_key_email=email&key=key" Как получить из всего этого только значение после "/?download_file" ? В моем случае это 41

255
Как получить имя того, кто запустил процесс? C#

Как получить имя того, кто запустил процесс? C#

В диспетчере задач есть такой столбец "Пользователь" где пишется от кого запущен, админ или пользв, как вывести это? Пока что я смог только...

453