【问题标题】:How to select listview item when clicking button单击按钮时如何选择列表视图项
【发布时间】:2017-01-25 13:48:17
【问题描述】:

在我的列表视图中,我创建了一个控件模板。在这个模板中,我制作了一个按钮,以便 mit listview 中的每个项目都有一个按钮。此按钮表示打开所示目录的链接。当我单击按钮时,我的程序会按预期打开资源管理器。但是,当我单击未选中的项目的按钮时,它会打开所选项目的路径。所以我的问题是,当我单击列表视图中的按钮时,如何更改所选项目。

这是它的样子:

如您所见,“R1”被选中,但我点击了“R3”的链接。发生的情况是,C:\Temp\Folder1 被打开,因为“R1”仍然是选定项。我希望 C:\Temp\Folder3 被打开。我认为诀窍应该是在单击代表链接的按钮时选择“R3”。有人知道怎么做吗?

这是我的 XAML 代码:

<ListView Grid.Row="1" ItemsSource="{Binding MyCollection}" FontSize="20" SelectedItem="{Binding SelectedMember, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="7,10,7,0" x:Name="ListView1" SelectionChanged="ListView1_SelectionChanged">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Header 1" Width="150"/>
                    <GridViewColumn Header="Header 2" Width="120"/>
                    <GridViewColumn Header="Header 3" Width="120"/>
                    <GridViewColumn Header="Header 4" Width="560"/>
                    <GridViewColumn Header="Header 5" Width="100"/>
                </GridView>
            </ListView.View>
            <ListView.ItemContainerStyle>
                <Style TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
                    <EventSetter Event="MouseDoubleClick" Handler="ListViewItem_MouseDoubleClick"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="150"/>
                                        <ColumnDefinition Width="120"/>
                                        <ColumnDefinition Width="120"/>
                                        <ColumnDefinition Width="560"/>
                                        <ColumnDefinition Width="100"/>
                                    </Grid.ColumnDefinitions>
                                    <ContentPresenter Grid.Column="0" Content="{Binding ID}" HorizontalAlignment="Center"/>
                                    <ContentPresenter Grid.Column="1" Content="{Binding Name}" HorizontalAlignment="Center"/>
                                    <ContentPresenter Grid.Column="2" Content="{Binding Description}" HorizontalAlignment="Center"/>
                                    <Button Grid.Column="3" Content="{Binding Path}" Style="{StaticResource Link}" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.GoToPathCommand }" HorizontalAlignment="Left" Margin="5,0,0,0" IsEnabled="{Binding ButtonEnabled}"/>
                                    <ContentPresenter Grid.Column="4" Content="{Binding Owner}" HorizontalAlignment="Center"/>
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="FontWeight" Value="Bold"/>
                            <Setter Property="Foreground" Value="DarkBlue"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>

【问题讨论】:

    标签: c# wpf listview


    【解决方案1】:
    Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.GoToPathCommand }"
    

    此命令将跳转到 ViewModel 的 Cmd。我假设命令将检查选择了哪个项目,并将访问它的属性Path

    为了避免这种行为,您可以创建一个命令,该命令将接受一个参数并从 Binding 设置它:

    <Button Content="{Binding Path}"
        Command="{Binding RelativeSource={RelativeSource FindAncestor,
                       AncestorType={x:Type Window}}, Path=DataContext.GoToPathCommand }"
    CommandParameter="{Binding Path}"/>
    

    现在必须调整命令本身:

    public MyCmd : ICommand
    {
    
        public void Execute(object parameter)
        {
            string path = (string) parameter;
            //Open the path via explorer
        }
    }
    

    【讨论】:

      【解决方案2】:

      尝试在 ListViewItem 样式中添加以下触发器

                   <Style.Triggers>
                       <Trigger Property="IsKeyboardFocusWithin" Value="True">
                          <Setter Property="IsSelected" Value="True"/>
                        </Trigger>
                   </Style.Triggers>
      

      【讨论】:

      • 这几乎是我正在寻找的,但它会导致另一个问题。现在单击该按钮可以正常工作。但是当我选择“R1”并单击“接受”按钮时,所选项目的焦点会丢失。
      猜你喜欢
      • 1970-01-01
      • 2016-06-17
      • 2021-12-15
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 2013-01-13
      相关资源
      最近更新 更多