2012-07-04 24 views
6

Bu ... oldukça popüler bir konu gibi görünüyor, ama Görsel ağ üzerinden ContextMenu menüden bir kontrole nasıl erişilir?

Aşağıdaki XAML vardır:

<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> 

Şimdi MyCommandObject onun DataContext dinamik komutları gösterir bir kontrolüdür. Sırada ne olduğunu biliyorsun.

Temel olarak, düğme komutu mükemmel çalışıyor - ben tıklattığımda, MyCommandObject'daki DoAction komutu mükemmel şekilde çalıştırılıyor. Ancak, menüde komut çalıştırılamaz. datacontext bağlam menüsünü ayarlamak için placementTarget olmak gibi çeşitli hileleri denedim, böylece denetimlerin görsel ağacını geçebilir, ancak hiçbir şey yapmaz.

RelativeSource ve CommandTarget runer'larının hangi belirli hizalamaları işe yaramalı?

cevap

4

DataContext="{Binding PlacementTarget,... menuitems DataContext olarak düğmeye kuracak bağlayıcı ama bu pencerenizin VisualTree için ContextMenu eklemez ve ElementName bağlayıcı en işe yaramaz bu yüzden, çünkü bu oluyor.

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

DataContext="{Binding PlacementTarget,... Düğmesi (Placementtarget) ayarlar olarak -

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

Başka bir çözüm bu yapmaktır: ElementName bağlamaları kullanımı basit bir çözüm sizin Window/UserControl'ın kod arkasında bu eklemektir ContextMenu'nuzun DataContext'i, böylece Button'un DataContext komutunu komut vermek için kullanabilirsiniz.

Güncelleme:

denemek ve XAML NameScope ayarlamak için NameScope.NameScope Attached Property kullanmak ama kodu olmadan ana pencerenin NameScope alacak nasıl emin değilim yapabilir!

Josh Smith'in aşağıdaki makalesine benzer bir şey yapmak zorunda kalacaksınız, bunu XAML'de yapmanın bir yolunu sağlar; ama bu da (kod o tek bir satır daha sonra) kodu içerir -

Enable ElementName Bindings with ElementSpy

bu kod tek bir satır kullanmamayı herhangi bir özel nedeni var mı?

+0

Bunun için teşekkürler. Mümkünse kod arkası kullanmamaya çalışıyorum - XAML'de NameScope'u tanımlamak mümkün mü? Maalesef, komutun görüntülenmesini sağlayan düğme olarak menü öğesinin veri bağlamını ayarlayamıyorum. Bu, bir ızgara için bir içerik menüsü ve seçili öğenin DataContext'ine ihtiyacım var, böylece bu özelliklerden parametreye komut olarak iletebiliyorum. – Webreaper

+0

Arkada kod kullanmamanın nedeni, xaml'ın derlenmemesidir - her şey istemcide çalışma zamanında geç bağlama kullanılarak yapılır. – Webreaper

+1

@Webreaper Sadece senaryonuzdan mı yoksa genraldan mı bahsettiğinizden emin değilsiniz, fakat çoğunlukla XAML dosyaları derleme sırasında BAML içine derlenmiştir (davanıza bakan xaml'inize bakın); Bu bağlantılara başvurmanızı öneririm - [Derlenmiş XAML = BAML değil IL] (http://blogs.microsoft.co.il/blogs/tomershamam/archive/2007/05/25/Compiled-XAML-\_3D00\_ -BAML-not-IL.aspx) ve [B için ... BAML] (http://blogs.msdn.com/b/jimoneil/archive/2009/01/12/b-is-for-baml.aspx) – akjoshi

İlgili konular