【问题标题】:Click Event for button in ListView DataTemplate not firingListView DataTemplate 中的按钮单击事件未触发
【发布时间】:2019-12-20 00:53:48
【问题描述】:

我已经搜索了许多类似的问题,但似乎没有一个可以处理这种情况。我试图通过右键单击列表视图项(工作)和当用户左键单击更多省略号按钮(不工作)来打开上下文菜单。这适用于我的程序的另一部分,我在树视图中执行基本相同的操作,省略号按钮和右键单击树视图项都会打开上下文菜单。但是,在这种情况下,单击省略号按钮不会打开上下文菜单,只能右键单击该图块。它甚至没有命中按钮单击处理函数背后的代码中的断点。

我有一个 ListView 设置如下:

    <ListView x:Name="listViewStudents" 
            ItemsSource="{Binding Students}"
            SelectionChanged="StudentList_SelectionChanged">
        <ListView.ItemContainerStyle>
            <Style TargetType="{x:Type ListViewItem}">
                <Setter Property="Height" Value="36"></Setter>
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                <EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewItem_PreviewMouseLeftButtonDown"/>
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="50"/>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Grid.ContextMenu>
                        <ContextMenu x:Name="StudentContextMenu">
                            <ContextMenu.Items>
                                <MenuItem Header="View Details"                               
                                      Command="{Binding Source={x:Reference studentDetailsView}, Path=DataContext.OpenLinkCommand}"
                                      CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.DataContext}">
                                </MenuItem>
                            </ContextMenu.Items>
                        </ContextMenu>
                    </Grid.ContextMenu>
                    <TextBlock Grid.Column="1" Margin="0" Text="{Binding Name}" Foreground="Black" FontFamily="{StaticResource FontFamilyBody1}" FontSize="15"/>
                    <Button Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Right" Click="MoreButton_Click" Width="50" Margin="0,0,-14,0">
                        <materialDesign:PackIcon Kind="MoreVert"/>
                    </Button>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

下面是代码:

    private void MoreButton_Click(object sender, RoutedEventArgs e)
    {
        Button button = sender as Button;
        ContextMenu menu = (ContextMenu)(button).FindName("StudentContextMenu");
        menu.DataContext = button.DataContext;
        menu.IsOpen = true;
    }

那么为什么这个 ListView 在数据模板中没有一个按钮调用该函数来打开一个上下文菜单呢?为什么它会在 TreeView 上工作,但不是在这里?非常感谢任何帮助。

EDIT:我注释掉了 EventSetter "PreviewMouseLeftButtonDown" 以及后面代码中的处理函数,现在 xaml 中的按钮似乎工作得很好(它正在打开上下文菜单)。但是对于应用程序的某些逻辑,我需要 EventSetter 和处理程序。为什么 PreviewMouseLeftButtonDown 事件会阻止按钮事件?有没有办法让两者都工作?

【问题讨论】:

  • 你的代码对我来说似乎工作得很好。
  • @mm8 我刚刚对其进行了测试,并在我的帖子底部进行了编辑评论。关于为什么我不能同时拥有 previewmouseleftbuttondown 和按钮单击事件的任何想法?

标签: c# wpf xaml


【解决方案1】:

&lt;EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewItem_PreviewMouseLeftButtonDown"/&gt;

尝试将事件PreviewMouseLeftButtonDown 替换为MouseLeftButtonUpPreviewLeftButtonUpPreviewMouseLeftButtonDown 可能会占用您的按钮处理的事件。

【讨论】:

  • 哇!好吧,我想我只需要再研究一下 PreviewMouseLeftButtonDown ......它正在吞噬这个事件。即使我尝试了 MouseLeftButtonDown,它也不会触发,它必须是 MouseLeftButtonUp。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2010-10-21
  • 2013-01-17
  • 2012-03-14
  • 2011-12-02
  • 2013-10-14
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多