2012-07-04 22 views
6

यह एक बहुत लोकप्रिय विषय हो रहा है, लेकिन ...दृश्य पेड़ के माध्यम से ContextMenu menuitem से नियंत्रण का उपयोग कैसे करें?

मैं निम्नलिखित 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> 

अब, MyCommandObject एक नियंत्रण जो अपने DataContext से गतिशील आदेशों को उजागर करता है। आप जानते हैं कि आगे क्या आ रहा है। :)

असल में, बटन कमांड पूरी तरह से काम करता है - जब मैं इसे क्लिक करता हूं, MyCommandObject पर आदेश पूरी तरह से निष्पादित हो जाता है। हालांकि, मेन्यूटेम में कमांड निष्पादित नहीं होता है। मैंने placementTarget होने के लिए संदर्भ मेनू datacontext सेट करने जैसी विभिन्न चालों की कोशिश की है, इसलिए यह नियंत्रण के दृश्य पेड़ को पार कर सकता है और ऐसा कुछ भी नहीं कर रहा है।

RelativeSource और CommandTarget रनों का विशेष संरेखण क्या मुझे इसे काम करने की आवश्यकता है?

उत्तर

4

इसका कारण यह है DataContext="{Binding PlacementTarget,... MenuItems DataContext के रूप में बटन स्थापित करेगा बाध्यकारी लेकिन वह अपनी विंडो के VisualTree को ContextMenu नहीं जोड़ेंगे और यही कारण है कि ElementName बंधन का काम नहीं करेगा है हो रहा है।

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

DataContext="{Binding PlacementTarget,... बटन (Placementtarget) सेट हो जाएगा के रूप में -

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

एक अन्य समाधान यह करने के लिए है: ElementName बाइंडिंग का उपयोग करने के लिए एक सरल समाधान का अपने विंडो/UserControl का कोड-पीछे में जोड़ने के लिए है आपके ContextMenu का DataContext, ताकि आप कमांड को बाध्य करने के लिए बटन के DataContext का उपयोग कर सकें।

अद्यतन:

आप कोशिश कर सकते हैं और NameScope.NameScope Attached Property का उपयोग XAML में NameScope स्थापित करने के लिए लेकिन मुझे यकीन है कि कैसे आप कोड के बिना माता पिता के विंडो के NameScope मिल जाएगा नहीं कर रहा हूँ!

आपको जोश स्मिथ द्वारा निम्नलिखित लेख के समान कुछ करना होगा, वह एक्सएएमएल में ऐसा करने का एक तरीका प्रदान करता है; लेकिन वह भी (तब कोड की है कि एक पंक्ति अधिक) कोड शामिल है -

Enable ElementName Bindings with ElementSpy

कोई विशेष कारण कोड के इस एक पंक्ति का उपयोग नहीं करने के लिए?

+0

इसके लिए धन्यवाद। यदि संभव हो तो मैं कोड-बैक का उपयोग न करने की कोशिश कर रहा हूं - क्या एक्सएएमएल में नेमस्कोप को परिभाषित करना संभव है? दुर्भाग्य से, मैं मेनू आइटम का डेटा संदर्भ सेट करने के लिए बटन को सेट नहीं कर सकता। यह ग्रिड के लिए एक संदर्भ मेनू है, और मुझे चयनित आइटम के डेटाकॉन्टेक्स्ट की आवश्यकता है ताकि मैं उसमें गुणों को कमांड के पैरामीटर के रूप में पास कर सकूं। – Webreaper

+0

पीछे कोड का उपयोग न करने का कारण यह है कि xaml संकलित नहीं है - देर से बाध्यकारी का उपयोग कर क्लाइंट में सब कुछ चलाया जाता है। – Webreaper

+1

@Webreaper यह सुनिश्चित नहीं है कि आप केवल अपने परिदृश्य या जननांग के बारे में बात कर रहे हैं, लेकिन ज्यादातर XAML फ़ाइलों को निर्माण के समय बीएएमएल में संकलित किया गया है (आपके एक्सएमएल को देखते हुए जो मामला दिखता है); मैं आपको इन लिंक को संदर्भित करने का सुझाव दूंगा - [संकलित XAML = BAML नहीं आईएल] (http://blogs.microsoft.co.il/blogs/tomershamam/archive/2007/05/25/Compiled-XAML-\_3D00\_ -BAML-not-IL.aspx) और [बी के लिए है ... बीएएमएल] (http://blogs.msdn.com/b/jimoneil/archive/2009/01/12/b-is-for-baml।एएसपीएक्स) – akjoshi