C# 如何在包含多个元素的列表框中处理MouseDown

C# 如何在包含多个元素的列表框中处理MouseDown,c#,wpf,xaml,binding,C#,Wpf,Xaml,Binding,我有一个列表框,看起来像这样: <ListBox Name="ListBoxUsers" ItemsSource="{Binding Path=TempObservableUsers, ElementName=MainWindow, NotifyOnSourceUpdated=True}" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Hidden"

我有一个
列表框
,看起来像这样:

<ListBox Name="ListBoxUsers" ItemsSource="{Binding Path=TempObservableUsers, ElementName=MainWindow, NotifyOnSourceUpdated=True}" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Hidden" />
好,然后:

如您所见,每个项目在右上角都包含一些图像。我希望每个人都能做好自己的工作:编辑,更多,删除

因此,我需要将每个图像单击与列表框上的相应项绑定

如何绑定每个图像单击以执行相应的操作(编辑、更新、删除)以及
列表框中相应的项目?

编辑:现在,对于每个项目模板,我的代码如下所示:

<StackPanel Orientation="Horizontal" Margin="5" HorizontalAlignment="Right" VerticalAlignment="Top">
      <Button Command="{Binding DataContext.DeleteCommand}" CommandTarget="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox}}" CommandParameter="{Binding}">
          <Image Source="../images/delete.png" Width="20" />
      </Button>
      ............
 </StackPanel>

............
如何实现
DeleteCommand

PS:我还没有使用MVVM模式,因为我不熟悉它。仅尝试绑定该按钮命令时,我直接从我的ResourceDictionary中获取xaml。

如果我试图满足您的要求,那么我将使用带有
图像的
按钮,而不是单独使用
图像。接下来,我将使用的一种形式来处理视图模型中的
ICommand
s。使用此方法,使用
CommandParameter
属性可以轻松地将相关项传递到
ICommand

<StackPanel Orientation="Horizontal" Margin="5" HorizontalAlignment="Right" 
    VerticalAlignment="Top">
    <Button Command="{Binding DataContext.EditCommand, RelativeSource={RelativeSource
        AncestorType={x:Type YourPrefix:ThisView}}}" CommandParameter="{Binding}">
        <Image Source="../images/edit.png" Width="20" />
    </Button>
    <Button Command="{Binding DataContext.DetailCommand, RelativeSource={RelativeSource
        AncestorType={x:Type YourPrefix:ThisView}}}" CommandParameter="{Binding}">
        <Image Source="../images/detail.png" Width="20" />
    </Button>
    <Button Command="{Binding DataContext.DeleteCommand, RelativeSource={RelativeSource
        AncestorType={x:Type YourPrefix:ThisView}}}" CommandParameter="{Binding}">
        <Image Source="../images/delete.png" Width="20" />
    </Button>
</StackPanel>

为了实现这一点,它假定:

1) 您已将
窗口的
DataContext
UserControl
设置为一个类的实例,该类具有名为
EditCommand
DetailCommand
DeleteCommand
ICommand
属性

2) 您可以将
yourprofix
的XAML名称空间前缀值替换为您自己的有效前缀

3) 用添加此代码的
Window
UserControl
的实际名称替换此代码所在视图的虚构
ThisView
名称,例如
main Window

至于如何使用
RelayCommand
s,这是另一个问题,与堆栈溢出的单一问题、单一问题的精神背道而驰。但是,有很多关于这方面的教程。以下是一些可以在路上帮助您的方法:

  • 如果您以前没有使用过
    ICommand
    s,那么MSDN上的页面是一个非常宝贵的资源,也是对它们的一个很好的介绍
  • 你会发现许多有用的帖子
  • 您可以在VisualStudio论坛的问题中找到该类的清晰实现

  • 因为并没有可用于图像的命令绑定,所以我将使用一个按钮(如图中所示)演示该绑定

    从为按钮编写样式开始,删除原始外观,只留下我想要显示的内容(本例中的图像)


    这一切就绪后,现在显示图像的“我的按钮”将绑定到命令,并在执行时将当前项作为命令参数推送(即单击按钮)

    此布局是否表明参数与具有命令的对象相同?“那你就不需要了。”谢里登听起来很有趣。我正在将图像更改为按钮(没错,这比使用图像要好)。那么,如何实现
    EditCommand
    DetailCommand
    等等呢?在哪里以及如何实施?@Icecat,是的,你说得很对。。。谢谢你指出这一点。我将相应地编辑我的答案。@Sheridan我终于可以实现它了!非常感谢您提供的信息!:)伟大的我正在换纽扣。现在我正试图弄清楚如何实现
    delete命令
    和其他命令!您可以参考本主题,了解如何在wpf中实现中继命令
    <StackPanel Orientation="Horizontal" Margin="5" HorizontalAlignment="Right" 
        VerticalAlignment="Top">
        <Button Command="{Binding DataContext.EditCommand, RelativeSource={RelativeSource
            AncestorType={x:Type YourPrefix:ThisView}}}" CommandParameter="{Binding}">
            <Image Source="../images/edit.png" Width="20" />
        </Button>
        <Button Command="{Binding DataContext.DetailCommand, RelativeSource={RelativeSource
            AncestorType={x:Type YourPrefix:ThisView}}}" CommandParameter="{Binding}">
            <Image Source="../images/detail.png" Width="20" />
        </Button>
        <Button Command="{Binding DataContext.DeleteCommand, RelativeSource={RelativeSource
            AncestorType={x:Type YourPrefix:ThisView}}}" CommandParameter="{Binding}">
            <Image Source="../images/delete.png" Width="20" />
        </Button>
    </StackPanel>
    
    <Style x:Key="simpleButton" TargetType="Button">
        <Setter Property="Width" Value="70"/>
        <Setter Property="Height" Value="70"/>
        <Setter Property="Margin" Value="5"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <ContentPresenter/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    
    <DataTemplate>
        <StackPanel Orientation="Vertical" Width="450" Margin="0,5" >
            <StackPanel Orientation="Horizontal" Background="{DynamicResource TransparentMainBlue}" >
                <Button Style="{StaticResource simpleButton}" 
                        Command="{Binding DataContext.DeleteCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=LixtBox}}" 
                        CommandParameter="{Binding}">
                    <Image Source="../images/delete.png"/>
                </Button>
                ...
    
    public ICommand DeleteCommand { get; set; }