Я хотел бы обработать событие SelectionChanged в элементе WPF DataGrid только для взаимодействия с пользователем / выбора и пропустить, если это связано с привязкой или другими установленными значениями. Есть идеи, как я определю, изменен ли выбор в результате взаимодействия с пользователем? Или любое другое мероприятие, которое решило бы аналогичную задачу?
может ли событие SelectionChanged в WPF обрабатываться только для взаимодействия с пользователем?
Ответы (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;
}
привет, вы можете использовать это в 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;
}
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
}
}