【问题标题】:WPF: context menu in TreeViewItem binding to rootWPF:TreeViewItem 中的上下文菜单绑定到根
【发布时间】: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 上面的&lt;TextBox Text="{Binding Header}"&gt;&lt;/TextBox&gt; 中绑定可以正常工作。
  • 如果您愿意,请使用您如何绑定视图模型来编辑您的问题

标签: c# wpf binding treeview


【解决方案1】:

您可以使用{RelativeSource}TreeViewItemTag 属性绑定到父窗口或用户控件,然后将MenuItemHeader 属性绑定到@ 的Tag 属性ContextMenu的987654327@:

<TreeView x:Name="tv" ItemsSource="{Binding Items}" Grid.Row="1">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType=Window}}" />
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                        <MenuItem Header="{Binding PlacementTarget.Tag.DataContext.Header, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
                    </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>

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

【讨论】:

  • 非常感谢!它完美无缺!再次感谢。
猜你喜欢
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 2016-07-14
  • 2014-07-20
  • 1970-01-01
相关资源
最近更新 更多