C# 绑定到ItemsControl中的项

C# 绑定到ItemsControl中的项,c#,wpf,bind,C#,Wpf,Bind,我对装订有问题。WPF中的XAML结构如下所示: <ItemsControl ItemsSource="{Binding cacheList}" > <ItemsControl.ItemTemplate> <DataTemplate> <StackPanel> <TextBlock Text="{Binding type}"/> &

我对装订有问题。WPF中的XAML结构如下所示:

<ItemsControl ItemsSource="{Binding cacheList}" >
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock  Text="{Binding type}"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseDown">
            <i:InvokeCommandAction Command="{Binding loadFromCache}" CommandParameter="-- BIND TO CLICKED ITEM --"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ItemsControl>

到目前为止,一切都很顺利。当我单击ItemsControl中的项时,我在ModelView类中注意到了这一点。但我不知道点击了哪个项目

我尝试通过以下方式绑定到“this”对象:

<i:InvokeCommandAction Command="{Binding loadCache}" CommandParameter="{Binding}"/>

但在本例中,我得到了奇怪的结果,因为我收到(签入输出):App.ViewModels.MainViewModel,它是所有视图的上下文,而不是这个特定项

如何操作,以便我可以解析单击了哪个项目

编辑:
我找到了一个解决方案:使用ListBox(或从Selector控件派生的任何东西)来使用SelectedItem属性。但是它不能满足我,我想保留ItemsControl。

现在我知道你想用绑定来实现这一点,你可以采用这种方法

首先,将文本框设为可单击区域,并创建一个输入绑定来处理鼠标单击:

<TextBlock Tag="{Binding}" Text="{Binding Name}">
    <TextBlock.InputBindings>
         <MouseBinding MouseAction="LeftClick" Command="{Binding ItemClick}" CommandParameter="{Binding}"/>
    </TextBlock.InputBindings>
</TextBlock>
然后,当左键单击发生时,命令实例“ItemClickCommand”将触发-并且您将使用该项作为命令参数:

public class ItemClickCommand : ICommand
{
    public event EventHandler CanExecuteChanged;

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public void Execute(object parameter)
    {
        // parameter will be the item clicked
    }
}

我在MVVM。这是为了学习,你的答案有助于立即解决问题。但我想知道如何通过绑定来实现。您的解决方案有效。我开始相信,除了使用从选择器控件派生的任何内容和绑定SelectedItem属性之外,没有其他方法。您可以将
ItemTemplate
更改为
按钮,并将
命令
绑定到
loadCache
(通过
RelativeSource
)和
CommandParameter
到当前
DataContext
,或者将触发器放在模板内(更准确地说是在StackPanel下)。为什么不想使用列表框呢?它的设计目的是以用户习惯的方式(用键盘选择等)准确地解决您的问题。由于样式和模板的原因,我不想使用ListBox。我的itemsControl是强样式的。我知道我也可以使用非常相同的样式覆盖ListBox样式。我开始这样做,但出现了@James Harcourt answer。
public class ItemClickCommand : ICommand
{
    public event EventHandler CanExecuteChanged;

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public void Execute(object parameter)
    {
        // parameter will be the item clicked
    }
}