2011-03-08 25 views
1

我有以下代碼:上下文菜單不顯示綁定物品

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> 

後面的代碼:

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

當我運行它,並右鍵單擊文本框,我得到一個上下文菜單填充,如預期的3個項目(A,B和C)。但是,如果我試圖明確地打開上下文菜單,通過註釋TextBox_OnMouseRightButtonUp中的代碼,我會得到一個空的上下文菜單。

當我試圖調試它時,似乎上下文菜單對象存在,但它是空的和未初始化的,例如它的ItemsSource屬性設置爲null。

任何人都有一個想法,爲什麼發生?

+1

也許在右鍵單擊的默認處理中,WPF會將DataContext分配給上下文菜單。在我的代碼中,當手動打開conext菜單時,我這樣做:this.ContextMenu.DataContext = this.DataContext。菜單按預期工作。 – Jogy 2011-03-08 11:52:13

回答

1

ContextMenu不屬於元素樹,正因爲如此,DataContext屬性不能傳播到ContextMenu。要解決此問題,請在OnMouseRightButtonUp中手動設置ContextMenu的數據上下文:

+0

Err。你是對的!但我很困惑。爲什麼當我隱式打開上下文菜單時它工作得很好?沒有這個事件?它不應該與DataContext有同樣的問題嗎? – VitalyB 2011-03-08 18:29:34

+0

很難說,爲什麼它的工作,可能是因爲Jogy提到,WPF將DataContext附加到上下文菜單。一個快速測試顯示,在ContextMenuOpening事件中,上下文菜單的DataContext爲null,但在ContextMenuOpened事件中,DataContext設置爲您的視圖模型(當'隱式'打開上下文菜單時)。 – 2011-03-09 14:32:25