在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控件的点击,以便跳过其中的代码。?
几个技巧:
-
remove Click事件,在您的OnSelectionChanged中,您通过视觉树查看TextBlock和Button的类型diff,如果它是一个按钮,在那里做你的特殊逻辑。
-
加载项DataGrid Mouse.PreviewMouseDown="OnPreviewMouseDown"。。。将在Click或SelectionChanged之前启动。。。所以你可以在那里添加你的逻辑。
-
清洁剂将绑定:
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中解决了这个问题。