我正在尝试绑定到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>
答案 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?