c# - 单击按钮时如何选择 ListView 项目

标签 c# wpf listview

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

它的样子是这样的:

enter image description here

正如您所看到的,“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>

最佳答案

Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.GoToPathCommand }"

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

为了避免这种行为,您可以创建一个命令,该命令将采用参数并从绑定(bind)中设置它:

<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
    }
}

关于c# - 单击按钮时如何选择 ListView 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41821639/

相关文章:

android - 什么时候在 ListView 中加载图像?

android - 切换 ChoiceMode 时 Android ListView 选择更改的问题

c# - 为 C# 中的每个表达式向 lambda 添加条件

c# - 我怎样才能创建一个 WPF 样式,以便所有图像控件上都有一个 MouseDown(click) 事件?

android ListView item点击闪烁bug

c# - 将新行添加到 XAML 中的 TextBlock 时,将 ScrollViewer 滚动到 WPF 中的底部

wpf - DrawingVisual 上模糊效果的替代方案

c# - 如何使用数据绑定(bind)动态填充 WPF 网格?

c# - 调用 Application.Exit() 后,应用程序仍在内存中运行

c# - 如何避免序列化默认值?