在wpf数据网格SelectionChanged中查找按钮控件单击

本文关键字:查找 按钮 控件 单击 SelectionChanged wpf 数据 数据网 网格 | 更新日期: 2023-09-27 18:27:30

我的数据网格代码如下

        <my:DataGrid Name="dgSupplierList" SelectionMode="Single"   CanUserResizeColumns="False" CanUserResizeRows="False"   
                 Margin="10,10,10,10"  AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" GridLinesVisibility="All" Background="Transparent"
                 RowHeight="23" RowBackground="White" AlternatingRowBackground="AliceBlue" SelectionUnit="FullRow" ColumnHeaderHeight="25"
                 OverridesDefaultStyle="True"  SelectionChanged="dgSupplierList_SelectionChanged" Grid.Row="1">
            <my:DataGrid.RowStyle>
                <Style TargetType="my:DataGridRow">
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Background" Value="White"/>
                            <Setter Property="Foreground" Value="White"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </my:DataGrid.RowStyle>
            <my:DataGrid.Columns>
                <my:DataGridTextColumn Binding="{Binding SupplierId}" Header="Supplier ID"  Visibility="Hidden" ></my:DataGridTextColumn>
                <my:DataGridTextColumn Binding="{Binding FullName}" Header="Organization" Width="225" IsReadOnly="True"></my:DataGridTextColumn>
                <my:DataGridTextColumn Binding="{Binding ChartName}" Header="Chart Name" Width="150" IsReadOnly="True"></my:DataGridTextColumn>
                <my:DataGridTextColumn Binding="{Binding ORG_ID}" Header="ID" Width="50" IsReadOnly="True"></my:DataGridTextColumn>
                <my:DataGridTextColumn Binding="{Binding Country}" Header="Country" Width="125" IsReadOnly="True"></my:DataGridTextColumn>
                <dg:DataGridTemplateColumn x:Name="AddStakeholders" Width="100" Header="Add Stakeholders" CanUserResize="False">
                    <dg:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button Background="Transparent" BorderBrush="Transparent"   Height="25" Tag="{Binding SupplierId}" CommandParameter="{Binding SupplierId}"   Name="btnAdd" Click="btnAdd_Click" >
                                <Image    Stretch="Uniform"  Margin="0,0,0,0"  Source="/ADES;component/Images/addimage.jpg"   />
                            </Button>
                        </DataTemplate>
                    </dg:DataGridTemplateColumn.CellTemplate>
                </dg:DataGridTemplateColumn>
            </my:DataGrid.Columns>
        </my:DataGrid>

单击按钮btAddd时,它调用方法btAdd_Click后面的代码。但由于数据网格中的按钮,在执行btAddd_Click方法之前,执行dgSupplierList_SelectionChanged。如果单击了btAddd,我想跳过dgSupplierList_SelectionChanged代码块的执行。我该怎么做?

我如何检查它是否是dgSupplierList_SelectionChanged内的btAdd控件的点击,以便跳过其中的代码。?

在wpf数据网格SelectionChanged中查找按钮控件单击

几个技巧:

  1. remove Click事件,在您的OnSelectionChanged中,您通过视觉树查看TextBlock和Button的类型diff,如果它是一个按钮,在那里做你的特殊逻辑。

  2. 加载项DataGrid Mouse.PreviewMouseDown="OnPreviewMouseDown"。。。将在Click或SelectionChanged之前启动。。。所以你可以在那里添加你的逻辑。

  3. 清洁剂将绑定:

    DataGrid的SelectedItem="{Binding MySelectedItem}"

    按钮的命令="{绑定命令}"

    这样,无论在ViewModel中,还是在代码后面,都可以设置,如果我选择的项目是这样的,我就不会执行命令

您的回答确实对我有效,但由于堆栈溢出优点规则,我无法提升它:-)。我遇到的问题是,我必须按下两次按钮才能启动命令。一次用于行选择,一次用于按钮按下。

通常情况下,我只会将命令绑定到数据网格中,它就会工作,

   <Button  Style="{StaticResource LinkButton}" Content="Remove" Command="{Binding DataContext.RemoveCommand, Source={StaticResource ProxyElement}}" CommandParameter="{Binding}" />

但如上所述,这并没有奏效。

这是我必须做的。

 <Button PreviewMouseDown="UIElement_OnPreviewMouseDown" Style="{StaticResource   LinkButton}" Content="Remove" />
  private void UIElement_OnPreviewMouseDown(object sender, MouseButtonEventArgs e) {
    ViewModel.RemoveCommand.Execute(((sender as Button).DataContext));
  }

这在数据网格中做到了,但它当然不是一个很好的MVVM解决方案,甚至让我不得不这么做也很痛苦。我使用的是WPF 3.5,所以也许MS在WPF 4.0中解决了这个问题。