2012-07-04 13 views
6

To wydaje się być dość popularny temat, ale ...Jak uzyskać dostęp do formantu z menu kontekstowego Menu kontekstowe za pomocą drzewa wizualnego?

Mam następujące XAML:

<internal:MyCommandObject x:Name="CommandModel"/> 

<Button DockPanel.Dock="Bottom" Command="{Binding DoAction, ElementName=CommandModel}"> 
    <Button.ContextMenu> 
     <ContextMenu DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}"> 
      <MenuItem Command="{Binding DoAction, ElementName=CommandModel}"/> 
     </ContextMenu> 
    </Button.ContextMenu> 
    Click Me 
</Button> 

Teraz MyCommandObject jest kontrola, która naraża dynamicznych poleceń z jego DataContext. Wiesz, co będzie dalej. :)

Zasadniczo polecenie przycisku działa idealnie - po jego kliknięciu polecenie DoAction na MyCommandObject zostaje wykonane perfekcyjnie. Jednak polecenie w menuitem nie zostanie wykonane. Próbowałem różnych sztuczek, takich jak ustawienie menu kontekstowego datacontext na placementTarget, aby mógł przechodzić przez wizualne drzewo kontrolek i tak dalej, ale nic nie robi.

Jakie konkretne ustawienia run RelativeSource i CommandTarget są potrzebne, aby to zadziałało?

Odpowiedz

4

Dzieje się tak dlatego, DataContext="{Binding PlacementTarget,... wiążący będzie ustawić przycisk jako elementów menu DataContext ale nie doda ContextMenu do VisualTree swojego okna i dlatego ElementName wiążące nie będzie działać. Prosty obejście używać ElementName powiązań jest dodanie tego w oknie/UserControl Kod z opóźnieniem:

NameScope.SetNameScope(contextMenuName, NameScope.GetNameScope(this)); 

Innym rozwiązaniem jest, aby to zrobić -

<ContextMenu DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}"> 
    <MenuItem Command="{Binding DataContext.DoAction}"/> 
</ContextMenu> 

DataContext="{Binding PlacementTarget,... ustawi przycisk (Placementtarget) jako Kontekst danych w ContextMenu, dzięki czemu można użyć polecenia DataContext przycisku do wiązania polecenia.

Aktualizacja:

Można spróbować użyć NameScope.NameScope Attached Property ustawić NameScope w XAML, ale nie jestem pewien, w jaki sposób można uzyskać NameScope okna nadrzędnego bez kodu!

Będziesz musiał zrobić coś podobnego do następującego artykułu Josha Smitha, który zapewnia sposób, aby to zrobić w XAML; ale to też wiąże kod (więcej niż tej jednej linii kodu) -

Enable ElementName Bindings with ElementSpy

Każdy konkretny powód, aby nie używać tej jednej linii kodu?

+0

Dzięki za to. Próbuję nie używać kodu z tyłu, jeśli to możliwe - czy możliwe jest zdefiniowanie NameScope w XAML? Niestety, nie mogę ustawić kontekstu danych pozycji menu jako przycisku, który eksponuje polecenie. Jest to menu kontekstowe dla siatki i potrzebuję DataContext dla wybranego elementu, aby można było przekazywać właściwości z tego jako parametry do polecenia. – Webreaper

+0

Powodem nieużywania kodu jest to, że xaml nie jest skompilowany - wszystko odbywa się w kliencie w czasie wykonywania z opóźnionym wiązaniem. – Webreaper

+1

@Webreaper Nie masz pewności, czy mówisz o swoim scenariuszu, czy w ogóle, ale głównie pliki XAML są kompilowane w BAML w czasie kompilacji (patrząc na twoje xaml, które również wygląda na to); Proponuję ci odesłać te linki - [Compiled XAML = BAML not IL] (http://blogs.microsoft.co.il/blogs/tomershamam/archive/2007/05/25/Compiled-XAML-\_3D00\_ -BAML-not-IL.aspx) i [B jest dla ... BAML] (http://blogs.msdn.com/b/jimoneil/archive/2009/01/12/b-is-for-baml.aspx) – akjoshi

Powiązane problemy