c# - 如何单击 ListView 项中的按钮?

标签 c# wpf xaml mvvm

我有一个这样的 ListView:

<ListView  x:Name="Thumbnails"   HorizontalContentAlignment ="Left" VerticalContentAlignment="Top" Padding="0"  Background ="#81AFD3" Grid.Row="6" Grid.Column="6" Grid.ColumnSpan="10" Grid.RowSpan="27" ScrollViewer.VerticalScrollBarVisibility="Visible" ItemsSource="{Binding NumberOfSlides}" SelectedItem="{Binding SelectedItem}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding ThumbnailsSelectionChangedCommand}" CommandParameter="{Binding Thumbnails.SelectedIndex, Mode=OneWayToSource}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>


    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="Content" Value="{StaticResource Thumbnail}" />
            <Setter Property="Margin" Value="{Binding ActualWidth, ElementName=DummyRectangle2}"/>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="IsSelected" Value="True"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListView.ItemContainerStyle>

    <ListView.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
         Color="Blue"/>
    </ListView.Resources>
</ListView>

并且列表的项目定义如下:
<Grid x:Key="Thumbnail" Width="{Binding ActualWidth, ElementName=DummyRectangle}" Height="{Binding ActualHeight, ElementName=DummyRectangle}" HorizontalAlignment="Center" VerticalAlignment="Top" Background="Transparent" >

    <Grid.RowDefinitions>
        <RowDefinition Height="1*" />
        <RowDefinition Height="1*" />
        <RowDefinition Height="1*" />
        <RowDefinition Height="1*" />
        <RowDefinition Height="1*" />
        <RowDefinition Height="1*" />
        <RowDefinition Height="1*" />
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
    </Grid.ColumnDefinitions>

    <Image Name="thumbImage" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="14" Grid.RowSpan="7" Stretch="UniformToFill" Source="/MS_Show_Assets/ImportAssets/Test.jpg"></Image>

    <StackPanel Name="Overlay" Grid.Row="0" Grid.Column="10" Grid.ColumnSpan="4" Grid.RowSpan="7" Background="LightBlue" Opacity="0.4"/>


    <Button Name="slide_ON_OFF" Grid.Row="0" Grid.Column="10" Grid.ColumnSpan="4" Grid.RowSpan="4" VerticalAlignment="Center" Background="Transparent" Command="{Binding SlideOnOffCommand}">
        <Button.Template>
            <ControlTemplate>
                <Grid RenderTransformOrigin="0.5,0.5" x:Name="bg">
                    <Image Source="/MS_Show_Assets/ImportAssets/Visible_ON.png"/>
                </Grid>
            </ControlTemplate>
        </Button.Template>

    </Button>

    <Button Name="fadein_ON_OFF" Grid.Row="3" Grid.Column="10" Grid.ColumnSpan="4" Grid.RowSpan="4" VerticalAlignment="Center" Background="Transparent">
    <Button.Template>
        <ControlTemplate>
            <Grid RenderTransformOrigin="0.5,0.5" x:Name="bg">
                <Image x:Name ="main_image" Source="/MS_Show_Assets/ImportAssets/Bulletpoint_ON.png"/>
            </Grid>
        </ControlTemplate>
    </Button.Template>
</Button>

和 View 模型:
 public CompositeCommand SlideOnOffCommand { get; set; }

SlideOnOffCommand = new CompositeCommand();
SlideOnOffCommand.RegisterCommand(new DelegateCommand(SlideOnOff));

 private void SlideOnOff()
        {

        }

如您所见,列表项包含一些按钮。我将其中一个连接到 ViewModel 中的命令,但是单击时,不会调用订阅的方法。如何使这些按钮可点击?

最佳答案

您必须提供 RelativeSource在按钮命令的命令绑定(bind)处。

您的命令应该类似于:

Command="{Binding DataContext.ThumbnailsSelectionChangedCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=Window} }"

如果 xaml 的根元素是 UserControl 而不是窗口,则绑定(bind)应如下所示:
Command="{Binding DataContext.ThumbnailsSelectionChangedCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl} }"

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

相关文章:

.net - 是什么让 MVVM 特别适合 WPF?

c# - XAML UWP 应用中的 Microsoft 通用广告客户端 SDK 广告中介器

c# - .NET c# - 自定义显示属性

c# - 如何使用 webclient 异步下载多个文件,但一次下载一个文件?

c# - 使用 C# 的 Azure 文本分析给出错误

wpf - Caliburn Micro Message.attach不考虑datacontext的变化

c# - 将多个 EF 上下文注册到一个 DI 容器中

c# - 是否有一种简单的 Cailburn.Micro 方法来显示新窗口/对话框?

c# - WP8 LongListSelector - 重新分配 ItemsSource 无效

c# - 多次显示和隐藏带有幻灯片动画的 WPF 窗口,同时每次都一致地显示动画