может ли событие SelectionChanged в WPF обрабатываться только для взаимодействия с пользователем?

Я хотел бы обработать событие SelectionChanged в элементе WPF DataGrid только для взаимодействия с пользователем / выбора и пропустить, если это связано с привязкой или другими установленными значениями. Есть идеи, как я определю, изменен ли выбор в результате взаимодействия с пользователем? Или любое другое мероприятие, которое решило бы аналогичную задачу?


person binyame tiruneh    schedule 13.01.2013    source источник
comment
Можете ли вы показать пример кода того, чего вы пытаетесь достичь?   -  person Rohit Vats    schedule 13.01.2013


Ответы (3)


Возможно, попробуйте объединить событие SelectionChanged с событием PreviewMouseDown. Когда пользователь щелкает строку, вы устанавливаете какое-то свойство и в SelectionChanged обработчике событий проверяете, было ли это свойство изменено.

Пример кода XAML:

<DataGrid SelectionChanged="OnSelectionChanged" PreviewMouseDown="OnPreviewMouseDown">
        <!--some code-->          
</DataGrid>

Код позади:

bool isUserInteraction;

private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (isUserInteraction)
    {
        //some code

        isUserInteraction = false;
    }
}

private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    isUserInteraction = true;
}
person Rafal    schedule 13.01.2013
comment
Кто-нибудь может придумать причину, по которой это не реализовано как отдельное мероприятие ...? При использовании MVVM-Pattern изменение всегда срабатывает даже при установке контекста данных ....: / +1 Rafal для этого трюка ':) - person dba; 09.11.2015
comment
Я думаю, что во многих случаях это не сработает: (1) если пользователь щелкнул так, что не привело к изменению выбора (например, щелчок по уже выбранной строке, использование модификаторов или других кнопок мыши), тогда выбор изменяется из-за привязки, привязка будет рассматриваться как действие пользователя. (2) Если пользователь использует клавиатуру для изменения выбора, это не будет рассматриваться как действие пользователя. - person hypehuman; 19.10.2017

привет, вы можете использовать это в xaml:

 <ComboBox x:Name="ComboBoxName" SelectionChanged="ComboBox_SelectionChanged">
                                        <ComboBox.Style>
                                            <Style TargetType="ComboBox">
                                                <Style.Triggers>                                                       
                                                    <Trigger Property="IsDropDownOpen" Value="True">
                                                        <Setter Property="IsEditable" Value="True"></Setter>
                                                    </Trigger>
                                                </Style.Triggers>
                                            </Style>
                                        </ComboBox.Style>
                                    </ComboBox>

и в коде позади:

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (!((ComboBox)sender).IsEditable) return;
        //Do Stuff;
    }
person luka    schedule 02.11.2017
comment
Добавление еще одного триггера, такого как для IsDropDownOpen, но с событием IsKeyboardFocused, гарантирует, что изменения раскрывающегося списка с клавиатуры также обрабатываются. - person Jens.Huehn_at_SlideFab.com; 06.01.2021

Другой метод - обработка событий DropDownOpened и DropDownClosed ComboBox. Это немного лучше, чем принятый ответ Рафала, потому что он предотвращает застревание логического флага как истинного, если пользователь щелкнул ComboBox, а затем щелкнул где-то еще, что привело к закрытию ComboBox без выбора. Однако это не решает проблемы, если ComboBox имеет фокус клавиатуры, и пользователь нажимает стрелки вверх и вниз, чтобы изменить выбор.

private void Event_ComboBox_DropDownOpened(object sender, EventArgs e)
{
    isUserInteraction = true;
}

private void Event_ComboBox_DropDownClosed(object sender, EventArgs e)
{
    isUserInteraction = false;
}

private void Event_ComboBox_SelectedChanged(object sender, SelectionChangedEventArgs e)
{
    if (isUserInteraction)
    {
        // Do work
    }
}
person savetruman    schedule 25.02.2018