2013-03-17 5 views
1

MainWindow의 속성에 바인딩하려고 시도했지만 ContextMenu에서 DataTemplate 내에 있습니다. 이것을 어떻게 할 수 있습니까? 의 ContextMenu I가 PlacementTarget를 사용할 수 ItemTemplate 내의 부모 UIElement에 어떻게 바인딩 할 수 있습니까?

  • 비주얼 트리의 아니므로 이것은 DataTemplate

    <Window x:Class="WpfApplication24.MainWindow" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ItemsControl ItemsSource="{Binding Data}"> 
        <ItemsControl.ItemTemplate> 
         <DataTemplate> 
          <Border Padding="5" CornerRadius="10" BorderThickness="1" BorderBrush="Red"> 
           <Border.ContextMenu> 
            <ContextMenu ItemsSource="{Binding <I want to bind to a property of MainWindow here>}"/> 
           </Border.ContextMenu> 
           <TextBlock Text="{Binding}"/> 
          </Border> 
         </DataTemplate> 
        </ItemsControl.ItemTemplate> 
    </ItemsControl> 
    
    의해 생성 UIElement 제공하므로

    • I는 ElementName를 사용할 수 없다

  • 답변

    2

    당신은에서 윈도우 객체를 가질 수 있습니다 당신의 Border의다음은 내가 사용하는 어떤 PlacementTarget.Tag

    <DataTemplate> 
        <Border Padding="5" CornerRadius="10" BorderThickness="1" BorderBrush="Red" 
          Tag="{Binding RelativeSource={RelativeSource FindAncestor, 
                     AncestorType=Window}}"> 
         <Border.ContextMenu> 
          <ContextMenu ItemsSource="{Binding PlacementTarget.Tag.PropertyName, 
                 RelativeSource={RelativeSource Self}}"/> 
         </Border.ContextMenu> 
         <TextBlock Text="{Binding}"/> 
        </Border> 
    </DataTemplate> 
    
    1

    간단한 custom control wrapper 예입니다 사용하여 액세스 할 수 있습니다 한 줄의 코드, 뭔가 등으로
    MyContextMenu ...

    public class MyContextMenu : ContextMenu 
    { 
        public override void EndInit() 
        { 
         base.EndInit(); 
         NameScope.SetNameScope(this, NameScope.GetNameScope(App.Current.MainWindow)); 
        } 
    } 
    

    ... 그리고 사용하는 대신 ContextMenu을.

    항상 최적이 아닐 수 MainWindow 항상 '스코프'그 -하지만 당신은 사용할 수 있습니다 ElementName

    다른 옵션은
    NameScope.NameScope 최적의 솔루션처럼 보인다 NameScope.NameScope="{StaticResource myNameScope}"을 사용

    2) - 단, 그것으로부터 바인딩 할 수 없다 (그리고 그것은 너무 늦게 묶는다).
    그러나 {StaticResource ...}을 사용할 수 있으며 MainWindow의 범위를 감싸는 클래스를 만듭니다.
    비슷하지만, 위의 '덜 파괴적인'것을 발견했습니다 (일반적으로 작성하는 코드를 작성할 수 있습니다). 자세한 내용은


    는 ... (더 많은 아이디어)이 답변을 살펴

    ElementName Binding from MenuItem in ContextMenu
    How to access a control from a ContextMenu menuitem via the visual tree?