从 DataTemplate 和 ItemsControl 中的 ContextMenu 绑定 CommandParameter
Bind CommandParameter from ContextMenu in DataTemplate and ItemsControl
在我的视图模型中,我有一个 ObservableCollection
,它包含 VaultViewModel
类型的元素。我的视图使用 ItemsControl
绑定到此集合。因为我还想显示一个类型为 NewVault
的额外项目,所以我是这样实现的:
<ItemsControl.Resources>
<CollectionViewSource x:Key="VaultsCollection" Source="{Binding VaultViewModels}"/>
<DataTemplate DataType="{x:Type viewmodels:VaultViewModel>
... data template for my vaults
</DataTemplate>
<DataTemplate DataType="{x:Type models:NewVault>
... data template for the additional item
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding Source={StaticResource VaultsCollection}}"/>
<models:NewVault/>
</CompositeCollection>
</ItemsControl.ItemsSource>
在我的 VaultViewModel
类型元素的 DataTemplate 中,我有一个 Canvas
,左键单击它时显示 ContextMenu
:
<Canvas ...>
<Canvas.Style>
<Style TargetType="Canvas">
<Style.Triggers>
<EventTrigger RoutedEvent="MouseLeftButtonUp">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen">
<DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Edit..."/>
<MenuItem Header="Delete"
Command="{Binding Source={x:Reference Name=icMain}, Path=DataContext.DeleteVaultCommand}"
CommandParameter="{Binding}"/>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</Canvas.Style>
</Canvas>
在我的 MenuItem
中,我绑定到一个在我的视图模型中实现的命令。该命令正在执行,但我在绑定 CommandParameter
时遇到问题。
我想使用CommandParameter="{Binding}"
传递ItemsControl
的当前元素是VaultViewModel
,但是命令的参数是null
并且没有控制台中的错误。我的问题是如何将 ItemsControl
的当前元素作为 CommandParameter
.
传递
我通过在持有 DataContext
的 Canvas
的资源中实施代理使其工作。之后,我可以将代理用作 StaticResource
的 CommandParameter
:
<Canvas.Resources>
<DiscreteObjectKeyFrame x:Key="DataContextProxy" Value="{Binding}"/>
</Canvas.Resources>
<MenuItem ... CommandParameter="{Binding Source={StaticResource DataContextProxy}}"/>
参数将是 System.Windows.Media.Animation.DiscreteObjectKeyFrame
类型,它在 属性 Value
中包含 DataContext
。
在我的视图模型中,我有一个 ObservableCollection
,它包含 VaultViewModel
类型的元素。我的视图使用 ItemsControl
绑定到此集合。因为我还想显示一个类型为 NewVault
的额外项目,所以我是这样实现的:
<ItemsControl.Resources>
<CollectionViewSource x:Key="VaultsCollection" Source="{Binding VaultViewModels}"/>
<DataTemplate DataType="{x:Type viewmodels:VaultViewModel>
... data template for my vaults
</DataTemplate>
<DataTemplate DataType="{x:Type models:NewVault>
... data template for the additional item
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding Source={StaticResource VaultsCollection}}"/>
<models:NewVault/>
</CompositeCollection>
</ItemsControl.ItemsSource>
在我的 VaultViewModel
类型元素的 DataTemplate 中,我有一个 Canvas
,左键单击它时显示 ContextMenu
:
<Canvas ...>
<Canvas.Style>
<Style TargetType="Canvas">
<Style.Triggers>
<EventTrigger RoutedEvent="MouseLeftButtonUp">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen">
<DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Edit..."/>
<MenuItem Header="Delete"
Command="{Binding Source={x:Reference Name=icMain}, Path=DataContext.DeleteVaultCommand}"
CommandParameter="{Binding}"/>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</Canvas.Style>
</Canvas>
在我的 MenuItem
中,我绑定到一个在我的视图模型中实现的命令。该命令正在执行,但我在绑定 CommandParameter
时遇到问题。
我想使用CommandParameter="{Binding}"
传递ItemsControl
的当前元素是VaultViewModel
,但是命令的参数是null
并且没有控制台中的错误。我的问题是如何将 ItemsControl
的当前元素作为 CommandParameter
.
我通过在持有 DataContext
的 Canvas
的资源中实施代理使其工作。之后,我可以将代理用作 StaticResource
的 CommandParameter
:
<Canvas.Resources>
<DiscreteObjectKeyFrame x:Key="DataContextProxy" Value="{Binding}"/>
</Canvas.Resources>
<MenuItem ... CommandParameter="{Binding Source={StaticResource DataContextProxy}}"/>
参数将是 System.Windows.Media.Animation.DiscreteObjectKeyFrame
类型,它在 属性 Value
中包含 DataContext
。