【问题标题】:Bind CommandParameter from ContextMenu in DataTemplate and ItemsControl在 DataTemplate 和 ItemsControl 中从 ContextMenu 绑定 CommandParameter
【发布时间】:2019-08-08 08:44:29
【问题描述】:

在我的视图模型中,我有一个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 传递。

【问题讨论】:

    标签: c# .net wpf itemscontrol


    【解决方案1】:

    我通过在拥有DataContextCanvas 的资源中实现代理使其工作。之后,我可以将代理用作StaticResourceCommandParameter

    <Canvas.Resources>
        <DiscreteObjectKeyFrame x:Key="DataContextProxy" Value="{Binding}"/>
    </Canvas.Resources>
    
    <MenuItem ... CommandParameter="{Binding Source={StaticResource DataContextProxy}}"/>
    

    参数类型为System.Windows.Media.Animation.DiscreteObjectKeyFrame,在其属性Value 中保存DataContext

    【讨论】:

    • 感谢您在找到答案后写下答案。你也可以试试 CommandParameter="{Binding ElementName=NameOfItemControlElement}"
    猜你喜欢
    • 2011-05-11
    • 2014-07-30
    • 2012-06-06
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多