WPF TreeView上的动态上下文菜单

时间:2013-03-11 13:09:38

标签: c# wpf treeview contextmenu

我有一个带有节点层次结构的WPF树视图的应用程序。我必须显示一个或多个所选节点的上下文菜单。选择一个或多个节点后,我的viewmodel中的一个集合将填充所有这些选定的节点。

我有一系列与我的treeview contextmenu绑定的menuitems。我只希望在用户右键单击节点(或节点)时评估此绑定。

这里更具体一点是我想要的:

  • 用户点击一个或多个菜单项以选择它们
  • 他右键单击以显示上下文菜单,我需要在此时评估上下文菜单(MenuItems),而不是当用户点击现在正在发生的每个菜单时。

以下是我的代码:

<TreeView MinWidth="100" ItemsSource="{Binding Nodes}">
    <i:Interaction.Behaviors>
        <Behaviors1:BindableSelectedItemBehavior SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />
    </i:Interaction.Behaviors>   
    <TreeView.ContextMenu>
        <ContextMenu ItemsSource="{Binding MenuItems}"  Visibility="{Binding ShowContextMenu, Converter={StaticResource VisibilityConverter}}">
            <ContextMenu.ItemContainerStyle>
                <Style TargetType="MenuItem">
                    <Setter Property="Header" Value="{Binding Name}"/>
                    <Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
                    <Setter Property="Command" Value="{Binding MenuCommand}"/>
                </Style>
            </ContextMenu.ItemContainerStyle>
        </ContextMenu>
    </TreeView.ContextMenu>
</TreeView>

我的ViewModel:

internal class MyViewModel : NotificationObject
{
    private readonly IContextMenuProvider _contextMenuProvider;

    public MyViewModel(IContextMenuProvider contextMenuProvider)
    {
        _contextMenuProvider = contextMenuProvider;
    }

    public ObservableCollection<IMenuItem> MenuItems
    {
        get
        {
            System.Diagnostics.Debug.WriteLine("Getting menu items");
            return GetMenuItems();
        }
    }

    private ObservableCollection<INodeViewModel> _selectedNodes;

    public ObservableCollection<INodeViewModel> SelectedNodes
    {
        get { return _selectedNodes; }
        set
        {
            _selectedNodes = value;
            System.Diagnostics.Debug.WriteLine("Setting selected nodes");

            foreach (var nodeViewModel in _selectedNodes)
            {
                System.Diagnostics.Debug.WriteLine(nodeViewModel.Name);
            }

            RaisePropertyChanged(() => SelectedNodes);
            RaisePropertyChanged(() => ShowContextMenu);
            RaisePropertyChanged(() => MenuItems);
        }
    }

    public bool ShowContextMenu
    {
        get
        {
            var canDisplay = _contextMenuProvider.GetMenuItemsByNodeContext(SelectedNodes);
                return !canDisplay.IsNullOrEmpty();
        }
    }

    private ObservableCollection<IMenuItem> GetMenuItems()
    {
        var items = _contextMenuProvider.GetAllMenuItems(SelectedNodes);
        var menuItems = new ObservableCollection<IMenuItem>(items);
        return menuItems;
    }
}

我面临的问题是:我不知道我应该在哪个位置获取菜单项,是否应该在选择节点集合填充或用户右键单击时执行此操作?我想要在右键单击期间理想地发生其中一个,问题如何在右键单击树视图上的节点时刷新我的treeview上下文绑定?

注意:我在NodeViewModel上有一个选定的属性供选择。

谢谢, -Mike

0 个答案:

没有答案