我希望仅为用户交互/选择处理WPF DataGrid元素中的SelectionChanged事件,如果是由于绑定或其他设置值,则跳过该事件。您知道我将如何确定用户交互是否更改了选择吗?或者知道将执行类似任务的任何备用事件?
hs1ihplo1#
也许可以尝试将SelectionChanged事件与PreviewMouseDown事件结合起来。当用户点击一行时,你设置了一些属性,并在SelectionChanged事件处理程序中检查该属性是否被更改。示例代码XAML:
SelectionChanged
PreviewMouseDown
<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; }
1qczuiv02#
hi你可以在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; }
7d7tgy0s3#
另一种方法是处理ComboBox的DropDownOpened和DropDownClosed事件。这比Rafal接受的答案稍好一些,因为如果用户单击ComboBox,然后单击其他地方,导致ComboBox在没有进行选择的情况下关闭,它可以防止布尔标志被固定为true。但是,ComboBox具有键盘焦点,并且用户点击向上和向下箭头以更改选择。
DropDownOpened
DropDownClosed
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 } }
6yjfywim4#
根据回复中的@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; }
4条答案
按热度按时间hs1ihplo1#
也许可以尝试将
SelectionChanged
事件与PreviewMouseDown
事件结合起来。当用户点击一行时,你设置了一些属性,并在SelectionChanged
事件处理程序中检查该属性是否被更改。示例代码XAML:
代码隐藏:
1qczuiv02#
hi你可以在xaml中使用这个:
在代码后面:
7d7tgy0s3#
另一种方法是处理ComboBox的
DropDownOpened
和DropDownClosed
事件。这比Rafal接受的答案稍好一些,因为如果用户单击ComboBox,然后单击其他地方,导致ComboBox在没有进行选择的情况下关闭,它可以防止布尔标志被固定为true。但是,ComboBox具有键盘焦点,并且用户点击向上和向下箭头以更改选择。6yjfywim4#
根据回复中的@luka和评论中的@Jens.Huehn_at_SlideFab.com,这是我找到的最好的解决方案(不会阻塞标签按钮,也不会改变控件的外观,或者其他怪癖):