c# - 重新选择 Datagrid 行后,SelectionChanged 事件不会触发?
问题描述
一个简单Datagrid
的按属性之一对行进行分组:
<DataGrid x:Name="MyDataGrid" SelectionChanged="MyDataGrid_SelectionChanged" ItemsSource="{Binding Programs}"
Style="{StaticResource dataGridStyle}">
<DataGrid.GroupStyle>
<GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}">
<GroupStyle.HeaderTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=Heading}" />
</StackPanel>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</DataGrid.GroupStyle>
</DataGrid>
Style
如果重要:
<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<StackPanel>
<TextBlock Text="{Binding Name}" FontWeight="Bold" Foreground="Aqua" HorizontalAlignment="Left" Margin="10,0,0,10" VerticalAlignment="Top"/>
<ItemsPresenter />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="dataGridStyle" TargetType="DataGrid">
<Setter Property="SelectionMode" Value="Extended"/>
<Setter Property="AutoGenerateColumns" Value="True"/>
<Setter Property="CanUserDeleteRows" Value="False"/>
<Setter Property="Background" Value="#302E2A"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="CanUserResizeColumns" Value="False"/>
<Setter Property="CanUserResizeRows" Value="False"/>
<Setter Property="CanUserSortColumns" Value="False"/>
<Setter Property="HeadersVisibility" Value="None"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="Height" Value="Auto"/>
<Setter Property="Width" Value="Auto"/>
<Setter Property="VerticalScrollBarVisibility" Value="Visible"/>
<Setter Property="HorizontalScrollBarVisibility" Value="Disabled"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="Margin" Value="10"/>
<Setter Property="GridLinesVisibility" Value="None"/>
<Setter Property="IsReadOnly" Value="True"/>
<Setter Property="SelectionMode" Value="Single"/>
</Style>
后面的代码:
private void FillSummit()
{
public ListCollectionView Programs { get; private set; }
Programs = new ListCollectionView(SummitPrograms);
Programs.GroupDescriptions.Add(new
PropertyGroupDescription("Room"));
}
private void MyDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
DataGrid dg = sender as DataGrid;
System.Windows.MessageBox.Show($"{dg?.SelectedItem}");
}
问题: 当我点击任何一行时,它会弹出一条消息,关闭它后,当我再次选择同一行时,它不会引发 selectionChangedEvent 那么我怎样才能让它工作,让它再次弹出呢?
解决方案
The SelectionChanged
event is only supposed to be raised when the selection actually changes to this is the expected behaviour.
您可以尝试处理PreviewMouseLeftButtonDown
容器DataGridRow
:
<DataGrid ...>
<DataGrid.ItemContainerStyle>
<Style TargetType="DataGridRow">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="dg_MouseLeftButtonDown"></EventSetter>
</Style>
</DataGrid.ItemContainerStyle>
...
</DataGrid>
推荐阅读
- javascript - 烧瓶熊猫到制表表都搞砸了
- python - 在 Python 中以不同字符串开头和结尾的字符串中查找字符串
- assembly - 引导加载程序。将字符串写入屏幕
- java - 从 CSV 文件解析不同类型的数据格式
- java - 使用hibernate管理多对多关系
- python - GridSearchCV 拟合
- angular - Angular *ngIf 内存使用情况
- sql - 如果满足另一个表中的条件,则显示表中的行
- amazon-web-services - AWS ElasticBeanstalk 从 Gitlab 注册表中提取 Docker 映像
- php - PHP json_decode 使用 Symfony 返回 null