0

私はこのスタイルをResourceDictionaryに持っています。これはトグルボタンのリストです。各ボタンに contextMenu を追加し、ビューモデルにクリック イベントを渡したいと考えています。メソッド Editindicator をビューモデルに持っています。プロジェクトを実行してコンテキストメニュー項目をクリックすると、壊れて、「{"メソッド Click のターゲットが見つかりません。"}」というエラーが表示されます。このエラーは、メニューアイテムがビューモデルのデータコンテキストを失ったためだと思います。誰でもここで助けることができますか?アドバイスどうもありがとう。

<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

ContextMenu は Visual ツリーの一部ではないため、UserControl に設定されている ViewModel の DataContext への参照は取得されません。コントロールのデータ コンテキストを取得するには、次の 2 つの方法があります。

編集: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 に答える
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 に答える