2016-07-22 7 views
1

...WPF Resources.ContextMenu.MenuItem. (AttachedProperty) 제목이 당신을 멀리 놀라게하지 않은 경우, 여기에 표시됩니다

기본적으로, 나는이 상황에 맞는 메뉴를 가지고
<UserControl.Resources> 
    <!-- so the attached CustomObject can bind to the context --> 
    <my:BindingProxy x:Key="DataContextProxy" Data="{Binding}" /> 

    <!-- for chaining IsNull to Visibility.Collapsed --> 
    <my:ConverterGroup x:Key="IsNullToVisibility"> 
     <my:IsNullConverter /> 
     <my:VisibilityValuesEqual /> 
    </my:ConverterGroup> 

    <ContextMenu x:Key="ctxmnu"> 
     <MenuItem Header="Copy" Click="ctxmnu_itmCopy_Click" /> 
     <MenuItem Header="Add" Click="ctxmnu_itmAdd_Click" 
        IsEnabled="{Binding Source={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, 
             Path=PlacementTarget, 
             Converter={StaticResource IsNotNullConverter}}" 
        Visibility="{Binding Source={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, 
             Path=PlacementTarget.(myAP:APClass.Property), 
             Converter={StaticResource IsNullToVisibility}}" 
        /> 
    </ContextMenu> 
</UserControl.Resources> 


    <Label Content="{Binding Path=Description}" ContextMenu="{StaticResource ctxmnu}"> 
     <myAP:APClass.Property> 
      <myAP:CustomObject ID="{Binding Source={StaticResource DataContextProxy}, Path=ID}" /> 
     </myAP:APClass.Property> 
    </Label> 

</UserControl> 

, 두 개의 메뉴 항목이있는 ... 첫 번째 (복사본)는 항상 사용할 수 있습니다. 둘째 (추가)는 컨텍스트 메뉴가 연결된 속성이있는 UIElement에서 적용된 경우에만 사용할 수 있습니다.

이 작품의 대부분은 첨부 된 속성이 프록시 리소스를 통해 올바르게 바인딩되어있어 menuitem 클릭 이벤트가 첨부 된 속성 값을 가져올 수 있습니다.

유일하게 작동하지 않는 것은 MenuItem.IsEnabled/Visibility 바인딩입니다. (처음에는 가시성을 바인딩했지만 근래에는 IsEnabled가 UX에 대해 더 좋은 아이디어라고 생각합니다).

오류가 바인딩에 있습니다. 출력 창에 표준 오류 40이 있습니다.

System.Windows.Data 
Error: 40 : 
BindingExpression path error: 
'PlacementTarget' property not found on 'object' ''RelativeSource' (HashCode=22838427)'. 
BindingExpression:Path=PlacementTarget.(0); DataItem='RelativeSource' (HashCode=22838427); 
target element is 'MenuItem' (Name=''); 
target property is 'Visibility' (type 'Visibility') 

것은 내가 (MenuItem을이 PlacementTarget 바인딩에 대한) 찾을 수 있었던 모든 기사 또는 예이다 UIElement에 직접 상황에 맞는 메뉴를 가지고 있으며, 윈도우/컨트롤을 인스턴스화 될 때부터 바인딩이 발생합니다 (상황에 맞는 메뉴가 표시되기 전에) PlacementTarget이 NULL이고 따라서 오류라고 생각하고 있습니다.

미리 Thx!

답변

1

바인딩의 Source 속성을 사용하여 RelativeSource을 할당하는 것이 문제입니다. 그것은해야한다 : 오류 보면

IsEnabled="{Binding RelativeSource={RelativeSource 
        ^^^^^^^^^^^^^^ 

은 실제로 설명 :

'PlacementTarget' property not found on 'object' ''RelativeSource' 

목적은 상황에 맞는 메뉴 봤는데한다.

+0

(지금 상태 결과가 거꾸로 됨) 내 코드를 조정해야합니다 ...하지만 오류가 표시되지 않으며 컨텍스트 메뉴의 다른 용도가 결과의 차이를 보여줍니다 ... 꽤 확신합니다 그것! ... 한때 확정 한 상을 수여 할 것입니다. –

+0

네, 알겠습니다. 가능한 한 빨리 현상금이 수여 될 것입니다 ... 저는 소스가 추상이고, RelativeSource가 구현이라고 생각했습니다. 분명히 그렇지 않습니다. .. 다시 thx! –

+0

아니요, '소스'를 사용하면 원본 개체를 직접 지정할 수 있습니다. 주로 C#에서 바인딩을 만들 때 사용됩니다. –