绑定到 ItemsControl 中的项目
Binding to items in ItemsControl
我有绑定问题。我在 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 class 中注意到了这一点。但我不知道点击了哪个特定项目。
我尝试通过以下方式绑定到 "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>
您可以看到 MouseBinding 处理鼠标的左键单击,并且指定的命令绑定到 ICommand,该 ICommand 在您的项目控件的项目对象类型中定义:
public class YourObject
{
public ICommand ItemClick { get { return new ItemClickCommand(); } }
public string Name { get; set; }
}
然后命令实例 "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
}
}
我有绑定问题。我在 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 class 中注意到了这一点。但我不知道点击了哪个特定项目。
我尝试通过以下方式绑定到 "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>
您可以看到 MouseBinding 处理鼠标的左键单击,并且指定的命令绑定到 ICommand,该 ICommand 在您的项目控件的项目对象类型中定义:
public class YourObject
{
public ICommand ItemClick { get { return new ItemClickCommand(); } }
public string Name { get; set; }
}
然后命令实例 "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
}
}