我希望能够处理WPF DataGrid元素中的SelectionChanged事件,仅用于用户交互/选择,如果是由于绑定或其他设置值,则跳过该事件。您有什么想法可以确定选定项是否是由用户交互所更改的?或者是否有任何替代事件可以执行类似的任务?
我希望能够处理WPF DataGrid元素中的SelectionChanged事件,仅用于用户交互/选择,如果是由于绑定或其他设置值,则跳过该事件。您有什么想法可以确定选定项是否是由用户交互所更改的?或者是否有任何替代事件可以执行类似的任务?
也许尝试将 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
可以确保通过键盘进行的下拉更改也得到处理。 - Jens.Huehn_at_SlideFab.comprivate 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
}
}
根据回复中的@luka和评论中的@Jens.Huehn_at_SlideFab.com,这是我找到的最佳解决方案(不阻止标签按钮,也不更改控件的外观或其他怪异行为):
<ComboBox SelectionChanged="ComboBox_SelectionChanged"
ItemsSource="{Binding ...}" SelectedItem="{Binding ...}">
<ComboBox.Style>
<Style TargetType="ComboBox">
<Setter Property="IsTextSearchEnabled" Value="False"/>
<Style.Triggers>
<Trigger Property="IsDropDownOpen" Value="True">
<Setter Property="IsTextSearchEnabled" Value="True"/>
</Trigger>
<Trigger Property="IsKeyboardFocused" Value="True">
<Setter Property="IsTextSearchEnabled" Value="True"/>
</Trigger>
</Style.Triggers>
</Style>
</ComboBox.Style>
</ComboBox>
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (!((ComboBox)sender).IsTextSearchEnabled) return;
//Do Stuff;
}