我有TreeView控件,我需要在树视图的上下文菜单中绑定root(window / usercontrol)DataContext的属性。
<TextBox Text="{Binding Header}"></TextBox>
<TreeView ItemsSource="{Binding Items}" Grid.Row="1">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="{{ BINDING TO HEADER PROPERTY FROM WINDOW DATACONTEXT}}"/>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
public ObservableCollection<string> Items { get; set; }
public string Header { get { return _header; } set { _header = value; } }
我尝试了多项内容:我已将x:Name="WindowRoot"
添加到Window和{Binding Header, ElementName=WindowRoot}
但它没有用,我尝试了多个FindAncestor和RelativeSource,但它没有用。< / p>
有人可以帮助我吗?
这是简化的情况,在我的正常应用程序中,我使用Unity + Prism
,因此ViewModel
是自动删除(prism:ViewModelLocator.AutoWireViewModel="True"
),它通常有效。通过“工作”我的意思是:TreeView显示我的集合中的项目,因此它是连接的,问题是仅与上下文菜单绑定。
在这个简化示例中,我有一个丑陋而简单的代码隐藏,因为我只想测试这个ContextMenu绑定:
public partial class MainWindow : Window
{
public ObservableCollection<string> Items { get; set; }
private string _header = "testtest";
public string Header { get { return _header ; } set { _header = value; } }
public MainWindow()
{
Items = new ObservableCollection<string>();
Items.Add("ItemTest");
InitializeComponent();
this.DataContext = this;
}
}
答案 0 :(得分:1)
您可以使用Tag
将TreeViewItem
的{{1}}属性绑定到父窗口或用户控件,然后绑定{RelativeSource}
的{{1}}属性} Header
的{{1}}的{{1}}属性:
MenuItem
您无法直接绑定到Tag
窗口的任何属性的原因是PlacementTarget
与父窗口或用户控件位于不同的元素树中。