如何绑定到ItemTemplate中的父UIElement?

时间:2013-03-17 11:26:03

标签: wpf binding contextmenu itemtemplate uielement

我正在尝试绑定到MainWindow的属性,但是来自ContextMenu中的DataTemplate。我怎样才能做到这一点?

  • 我无法使用ElementName,因为contextMenu不是可视树的一部分
  • 我无法使用PlacementTarget,因为这会提供UIElement

    生成的DataTemplate
    <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>
    

2 个答案:

答案 0 :(得分:2)

您可以在Tag的{​​{1}}中设置窗口对象,然后可以使用Border

访问它
PlacementTarget.Tag

答案 1 :(得分:1)

我使用的是一个简单的custom control wrapper,例如MyContextMenu
......只有一行代码,比如......

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范围的类 类似,但我发现上面的'破坏性较小'(你几乎可以写出你通常写的代码)。

<小时/> 有关详细信息,请查看此答案(以及更多想法)......

ElementName Binding from MenuItem in ContextMenu
How to access a control from a ContextMenu menuitem via the visual tree?