1

ContextMenu我正在尝试绑定到 MainWindow的属性,但从DataTemplate. 我怎样才能做到这一点?

  • 我不能使用ElementName,因为 contextMenu 不是可视树的一部分
  • 我不能使用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

您可以在您的窗口对象中TagBorder然后可以使用它访问它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

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 绑定
如何通过可视化树从 ContextMenu menuitem 访问控件?

于 2013-03-17T14:21:34.263 回答