c# – 在未选中的行中单击未在WPF Datagrid中触发的事件
我有一个像这样的DataGrid(
WPF 4):
<DataGrid Margin="0,5" VerticalAlignment="Top" Height="192" BorderBrush="#aaa" Background="White" HorizontalAlignment="Left" ItemsSource="{Binding Namen,Mode=OneWay}" ScrollViewer.VerticalScrollBarVisibility="Visible" AutoGenerateColumns="False" ColumnHeaderHeight="24" SelectionChanged="DataGridAuslaendischeAlteNamen_SelectionChanged"> <DataGrid.Columns> <DataGridTextColumn Width="*" Header="Namenseintrag" Binding="{Binding DisplayName,Mode=OneWay}" /> <DataGridTextColumn Width="75" Header="gültig von" Binding="{Binding GueltigAb,StringFormat=d,Mode=OneWay}" /> <DataGridTextColumn Width="75" Header="gültig bis" Binding="{Binding GueltigBis,StringFormat=d.,Mode=OneWay}" /> <DataGridTemplateColumn Width="20" IsReadOnly="True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Style="{DynamicResource CaratRemoveButton}" Click="Button_Click" CommandParameter="{Binding}" PreviewMouseDown="Button_PreviewMouseDown" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> 我遇到的问题是,如果未选中其行,则DataGridTemplateColumn的按钮不会触发click事件.所以我必须两次单击一个按钮,一次选择它的行然后再提高click事件. 我在这里错过了什么?无论是否选择了行,如何只需单击一次即可获得该单击事件? 解决方法
基本上,除了使用TemplateColumn并自己管理每个mouseEvent之外,你没有解决方案.
说明: click = mouseDown MouseUp,对. 但… 默认情况下,wpf的DataGrid的行处理MouseDown事件,以便选择你执行mouseDown的那一行(确认:单元格上的mouseDown并按住mouseButton,你会看到在释放之前选择了行按钮). 所以基本上,MouseDownEvent在到达按钮之前处理,阻止你能够使用按钮上的Click事件 微软在他们的文档中告诉我们,在这种情况下,我们应该转向预览类型的事件,但这不适用于click事件,因为你无法拥有previewClickEvent 因此,我能看到的唯一解决方案是在按钮上同时监听PreviewMouseDown和PreviewMouseUp,并自己模拟一下它们的点击 有点像这样的东西: Button myButton = new Button(); bool mouseLeftButtonDownOnMyButton; myButton.PreviewMouseLeftButtonDown += (s,e) => { mouseLeftButtonDownOnMyButton = true; }; myButton.PreviewMouseLeftButtonUp += (s,e) => { if (mouseLeftButtonDownOnMyButton) myButton.RaiseEvent( new RoutedEventArgs(Button.ClickEvent,myButton)); mouseLeftButtonDownOnMyButton = false; }; myButton.Click += myButtonCLickHandler; (当然,你需要在你的xaml模板中翻译它) 注意:这还不完整,你还应该注意用户在按钮上执行mouseDown但在执行mouseup之前将鼠标移出按钮的情况(在这种情况下你应该重置mouseLeftButtonDownOnMyButton标志).最好的方法可能是重置一般mouseUpEvent(例如在窗口级别)而不是按钮的标志. 编辑:上面的代码也允许您管理Click事件,并且只有一个代码用于实际和模拟的点击事件(因此使用RaiseEvent方法),但是如果你不需要这个,你可以直接把你的当然,还有PreviewMouseUp部分中的代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |