VitalyB
VitalyB

Reputation: 12855

Context menu doesn't show bound items when opened explicitely (via ContextMenu.IsOpen)

I have the following code:

XAML:

<Window x:Class="ContextMenuIssue.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
      <TextBox MouseRightButtonUp="TextBox_OnMouseRightButtonUp">
        <TextBox.ContextMenu>
          <ContextMenu ItemsSource="{Binding Items}"></ContextMenu>
        </TextBox.ContextMenu>
      </TextBox>
    </Grid>
</Window>

Code behind:

namespace ContextMenuIssue
{
    class Model
    {
        public Model()
        {
            _items = new List<string> {"A", "B", "C"};
        }

        private List<string> _items;
        public List<string> Items
        {
            get { return _items; }
            set { _items = value; }
        }
    }

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new Model();
        }

        private void TextBox_OnMouseRightButtonUp(object sender, MouseButtonEventArgs e)
        {
            //TextBox textBox = ((TextBox) sender);

            //textBox.ContextMenu.IsOpen = true;
            //e.Handled = true;
        }
    }
}

When I run it and right click on the textbox, I get a context menu populated, as expected by 3 items (A, B and C). However, if I try to open the context menu explictely, by commenting out the code in TextBox_OnMouseRightButtonUp I get an empty context menu.

When I was trying to debug it, it seems that the context menu object exists, but it is empty and uninitialized, e.g, its ItemsSource property is set to null.

Anyone has an idea why it happens?

Upvotes: 2

Views: 903

Answers (1)

Andrei Pana
Andrei Pana

Reputation: 4502

ContextMenu does not belong to the element tree, and because of this, the DataContext property cannot be propagated to the ContextMenu. To workaround this, manually set the data context for the ContextMenu in your OnMouseRightButtonUp:

textBox.ContextMenu.DataContext = this.DataContext;

Upvotes: 3

Related Questions