0

我在 ResourceDictionary 中有这种风格。这是一个 ToggleButton 的列表。我为每个按钮添加了一个 contextMenu,我想将点击事件传递给视图模型。我有方法 Editindicator 进入视图模型。当我运行该项目并单击上下文菜单项时,它损坏并显示此错误“{“No target found for method Click.”}”。我认为这个错误是由于 menuitem 丢失了 viewmodel 的数据上下文。有人可以在这里帮忙吗?非常感谢您的建议。

<Style x:Key="ListBoxStyleIndicador" TargetType="{x:Type ListBoxItem}">
        <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
    <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
    <Setter Property="Padding" Value="2,0,2,0"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate x:Name="ListBoxStyleIndicadorTemplate" TargetType="{x:Type ListBoxItem}">
                <Border x:Name="Bd"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        Background="{TemplateBinding Background}" 
                        Padding="{TemplateBinding Padding}" 
                        SnapsToDevicePixels="true">
                    <Controles:ToggleButtonIndicador 
                        Content="{Binding NombreIndicador}" 
                        IdBIIndicadores="{Binding IdBiIndicadores}" 
                        IsChecked="{Binding IsSelected, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" 
                        Style="{DynamicResource BotonNegro}"
                        Padding="6,2"                             
                        ToolTip="{Binding Descripcion}">
                        <Controles:ToggleButtonIndicador.ContextMenu >
                            <ContextMenu>
                                <MenuItem Header="Editar">
                                    <MenuItem.Icon>
                                        <Image Source="{DynamicResource ImagenBotonEditar}" />                                            
                                    </MenuItem.Icon>
                                    <Interactivity:Interaction.Triggers>
                                        <Interactivity:EventTrigger EventName="Click">
                                            <cal:ActionMessage MethodName="EditIndicator" />
                                        </Interactivity:EventTrigger>
                                    </Interactivity:Interaction.Triggers>
                                </MenuItem>                                  
                            </ContextMenu>
                        </Controles:ToggleButtonIndicador.ContextMenu>
                    </Controles:ToggleButtonIndicador>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="IsSelected" Value="{Binding Seleccionado, Mode=TwoWay}"/>        
</Style>

4

2 回答 2

0

以防它可以帮助任何人。在使用以下示例代码之前,强烈建议阅读CodeProject 上的将虚拟分支附加到 WPF 中的逻辑树。你会知道为什么会出现问题以及如何优雅地解决它。

这是一个简单的例子。

// Add a DataContextBridge.
<UserControl.Resources>
    <FrameworkElement x:Key="DataContextBridge" />
</UserControl.Resources>

// Bind.
<UserControl.DataContext>
    <Binding
        Mode="OneWayToSource"
        Path="DataContext"
        Source="{StaticResource DataContextBridge}" />
</UserControl.DataContext>

// Trigger a click event.
<ContextMenu>
    <MenuItem>
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <ei:CallMethodAction
                    TargetObject="{Binding Source={StaticResource DataContextBridge}, Path=DataContext}"
                    MethodName="OnClick" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </MenuItem>
</ContextMenu>

谢谢。

于 2014-10-25T22:56:56.067 回答
0

由于 ContextMenu 不是您的可视化树的一部分,因此您不会引用为您的 UserControl 设置的 ViewModel 的 DataContext。有两种方法可以获取控件的数据上下文 -

编辑:对于 DataContext 你可以这样做 -

<Controles:ToggleButtonIndicador Tag="{Binding DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}>
                        <Controles:ToggleButtonIndicador.ContextMenu >
                            <ContextMenu DataContext={Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}>
                                <MenuItem Header="Editar">
                                    <MenuItem.Icon>
                                        <Image Source="{DynamicResource ImagenBotonEditar}" />                                            
                                    </MenuItem.Icon>
                                    <Interactivity:Interaction.Triggers>
                                        <Interactivity:EventTrigger EventName="Click">
                                            <cal:ActionMessage MethodName="EditIndicator" />
                                        </Interactivity:EventTrigger>
                                    </Interactivity:Interaction.Triggers>
                                </MenuItem>                                  
                            </ContextMenu>
                        </Controles:ToggleButtonIndicador.ContextMenu>
                    </Controles:ToggleButtonIndicador>

我假设您的 viemodel 已绑定到您的 UserControl 的 DataContext 属性。

于 2011-10-17T08:12:57.123 回答