2011-03-08 4 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를 할당합니다. 내 코드에서 수동으로 컨텍스트 메뉴를 열 때이 작업을 수행합니다. this.ContextMenu.DataContext = this.DataContext. 메뉴가 예상대로 작동합니다. – Jogy

답변

1

ContextMenu가 요소 트리에 속해 있지 않으므로이 때문에 DataContext 속성을 ContextMenu로 전파 할 수 없습니다. 이 문제를 해결하려면 OnMouseRightButtonUp의 ContextMenu에 대한 데이터 컨텍스트를 수동으로 설정하십시오.

textBox.ContextMenu.DataContext = this.DataContext;

+0

오류 당신 말이 맞아요! 그러나 나는 혼란 스럽다. 암묵적으로 상황에 맞는 메뉴를 열면 정상적으로 작동하는 이유는 무엇입니까? 이벤트가 없다면? DataContext와 동일한 문제가 발생하지 않아야합니까? – VitalyB

+0

Jogy가 언급했듯이 WPF가 컨텍스트 메뉴에 DataContext를 첨부 한 이유를 설명하기가 쉽지 않습니다. 빠른 테스트는 ContextMenuOpening 이벤트에서 컨텍스트 메뉴의 DataContext가 null이지만 ContextMenuOpened 이벤트에서 DataContext가 (컨텍스트 메뉴를 '암시 적으로'열 때) 뷰 모델로 설정되었음을 보여줍니다. –

관련 문제