...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!
(지금 상태 결과가 거꾸로 됨) 내 코드를 조정해야합니다 ...하지만 오류가 표시되지 않으며 컨텍스트 메뉴의 다른 용도가 결과의 차이를 보여줍니다 ... 꽤 확신합니다 그것! ... 한때 확정 한 상을 수여 할 것입니다. –
네, 알겠습니다. 가능한 한 빨리 현상금이 수여 될 것입니다 ... 저는 소스가 추상이고, RelativeSource가 구현이라고 생각했습니다. 분명히 그렇지 않습니다. .. 다시 thx! –
아니요, '소스'를 사용하면 원본 개체를 직접 지정할 수 있습니다. 주로 C#에서 바인딩을 만들 때 사용됩니다. –