单击未在未选择行中的WPF Datagrid中触发的事件

And*_* H. 6 c# wpf wpfdatagrid

我有一个像这样的DataGrid(WPF 4):

<DataGrid   Margin="0,0,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>
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,DataGridTemplateColumn如果未选中其行,则该按钮不会触发click事件.所以我必须两次单击一个按钮,一次选择它的行然后再提高click事件.我读过有关复选框列的类似问题,但显然建议使用模板列.我测试使用按钮的PreviewMouseDown-Event,它有效,但不是我想要的,因为那时按钮不遵循其通常的grpahical点击行为.

我在这里错过了什么?无论是否选择了行,如何只需单击一次即可获得该单击事件?

Dav*_*vid 8

基本上,除了使用TemplateColumn并自己管理每个mouseEvent之外,你没有解决方案.

说明:

click = mouseDown+ MouseUp,right.所以你的按钮需要能够获得mouseDown + MouseUp事件.

但...

默认情况下,wpf的DataGrid的行处理MouseDownEvent以便选择你执行的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;
Run Code Online (Sandbox Code Playgroud)

(当然,你需要在你的xaml模板中翻译它)

注意:这还不完整,你还应该注意用户在按钮上执行mouseDown但在执行鼠标操作之前将鼠标移出按钮的情况(在这种情况下你应该重置mouseLeftButtonDownOnMyButton标志).最好的方法可能是重置一般mouseUpEvent(例如在窗口级别)而不是按钮的标志.

编辑:上面的代码也允许您管理Click事件,并且只有一个代码用于实际和模拟的点击事件(因此使用RaiseEvent方法),但是如果你不需要这个,你可以直接把你的当然,还有PreviewMouseUp部分中的代码.