WPF:TreeViewItem中的上下文菜单绑定到root

时间:2017-06-03 22:24:48

标签: c# wpf binding treeview

我有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;
    }
}

1 个答案:

答案 0 :(得分:1)

您可以使用TagTreeViewItem的{​​{1}}属性绑定到父窗口或用户控件,然后绑定{RelativeSource}的{​​{1}}属性} Header的{​​{1}}的{​​{1}}属性:

MenuItem

您无法直接绑定到Tag窗口的任何属性的原因是PlacementTarget与父窗口或用户控件位于不同的元素树中。