1

UserControl1とUserControl2を含むウィンドウがあります。これらのユーザーコントロールには、独自のビューモデルがあります。また、これらのユーザーコントロールは、UserControl3を使用してデータを表示します。したがって、UserControl1がUserControl3を使用する場合、UserControl3はUserControl1と同じビューモデルを持ちます。

UserControl1のビューモデルにあるコマンドを呼び出したいUserControl3にバインディングがあります。

しかし、私はそれを機能させる方法を見つけることができません。どんな助けでも歓迎します。どうもありがとうございます。

これが機能しない私のバインディングです:

<UserControl x:Class="MyNamespace.UserControl3"             
         xmlns:local="clr-namespace:MyNamespace">    
<UserControl.Resources>        
    <DataTemplate DataType="{x:Type g:GraphNode}"> 
        <StackPanel>               
            <StackPanel.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="My Command" Command="{Binding Path=DataContext.MyCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:UserControl3}}}"/>
                </ContextMenu>
            </StackPanel.ContextMenu>               
            <Grid>
                <ContentControl Content="{Binding Data}"/>                      
            </Grid> 
        </StackPanel>             
    </DataTemplate>       
</UserControl.Resources>

4

1 に答える 1

1

これは私のアプリで機能します:

<DataTemplate DataType="{x:Type g:GraphNode}">
        <StackPanel Tag="{Binding}">
            <StackPanel.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="My Command" Command="{Binding Path=PlacementTarget.Tag.MyCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}" />
                </ContextMenu>
            </StackPanel.ContextMenu>
        </StackPanel>
    </DataTemplate>

重要なのは、ContextMenuが別のウィンドウにあるため、通常のようにデータコンテキストにアクセスできないことです。
これを調整して、Commandシークを含むオブジェクトがStackPanel(のタグ)として設定されるようにする必要がPlacementTargetありますContextMenu

于 2012-04-05T08:38:19.797 に答える