1

MainWindowのプロパティにバインドしようとしていますが、ContextMenu内からDataTemplate。どうすればこれを達成できますか?

  • ElementNamecontextMenuがビジュアルツリーの一部ではないため、を使用できません
  • 私は使用できません、これはによって生成されたものPlacementTargetを与えるので、UIElementDataTemplate

    <Window x:Class="WpfApplication24.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ItemsControl ItemsSource="{Binding Data}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Border Padding="5" CornerRadius="10" BorderThickness="1" BorderBrush="Red">
                    <Border.ContextMenu>
                        <ContextMenu ItemsSource="{Binding <I want to bind to a property of MainWindow here>}"/>
                    </Border.ContextMenu>
                    <TextBlock Text="{Binding}"/>
                </Border>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    

4

2 に答える 2

2

Tagあなたはあなたの中にウィンドウオブジェクトを持つことができBorder、それからそれを使ってそれにアクセスすることができますPlacementTarget.Tag

<DataTemplate>
   <Border Padding="5" CornerRadius="10" BorderThickness="1" BorderBrush="Red"
           Tag="{Binding RelativeSource={RelativeSource FindAncestor, 
                                                        AncestorType=Window}}">
       <Border.ContextMenu>
            <ContextMenu ItemsSource="{Binding PlacementTarget.Tag.PropertyName,
                                       RelativeSource={RelativeSource Self}}"/>
       </Border.ContextMenu>
       <TextBlock Text="{Binding}"/>
    </Border>
</DataTemplate>
于 2013-03-17T11:32:57.087 に答える
1

私が使用したのは単純なものです。custom control wrapperたとえばMyContextMenu
、1行のコードで...

public class MyContextMenu : ContextMenu
{
    public override void EndInit()
    {
        base.EndInit();
        NameScope.SetNameScope(this, NameScope.GetNameScope(App.Current.MainWindow));
    }
}

...そしての代わりにそれを使用してContextMenuください。

それは常に「スコープ」MainWindowであり、常に最適であるとは限りませんが、ElementNameなど を使用できます。

2)他のオプションは、使用NameScope.NameScope="{StaticResource myNameScope}"
NameScope.NameScopeすることが最適な解決策のように思われますが、そこからバインドすることはできません(そして、「遅すぎる」とバインドします)。
ただし、{StaticResource ...}-を使用して、MainWindowのスコープをラップするクラスを作成できます。
同様ですが、上記の「混乱が少ない」ことがわかりました(通常作成するコードはほとんど作成できます)。


詳細については、この回答をご覧ください(およびその他のアイデアについて)...

ContextMenuのMenuItemからのElementNameバインディング
ビジュアルツリーを介してContextMenumenuitemからコントロールにアクセスするにはどうすればよいですか?

于 2013-03-17T14:21:34.263 に答える