【发布时间】:2017-11-05 01:17:45
【问题描述】:
我有 TreeView 控件,我需要在该树视图的上下文菜单中绑定根(窗口/用户控件)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 但它不起作用。
有人可以帮我吗?
编辑:
这是简化的情况,在我的正常应用程序中,我使用 Unity + Prism,所以 ViewModel 是自动发现的 (prism:ViewModelLocator.AutoWireViewModel="True"),它通常可以工作。我所说的“工作”是指:TreeView 显示我的收藏中的项目,因此它是连接的,问题仅在于上下文菜单绑定。
在这个 simplified 示例中,我有丑陋而简单的代码隐藏,因为我只想测试这个 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;
}
}
【问题讨论】:
-
尝试将 DataContext 添加到您的绑定中,以便 DataContext.Header
-
@NicolasPierre 感谢您的想法,遗憾的是它也不起作用(它在直接在窗口中的 TextBox 中工作正常,因此属性 Header 没有问题)
-
您的 DataContext 是否正确绑定?
-
除了
window.DataContext = MyViewModel,我还需要做什么吗?在TreeView上面的<TextBox Text="{Binding Header}"></TextBox>中绑定可以正常工作。 -
如果您愿意,请使用您如何绑定视图模型来编辑您的问题