2012-11-27 45 views
6

मेरे पास एक सूची बॉक्स है जिसके लिए मैं एक संदर्भ मेनू शामिल करने के लिए ItemContainer स्टाइल कर रहा हूं। इसके लिए xaml यहां है।कैलिबर संदेश द्वारा डाला गया "विधि के लिए कोई लक्ष्य नहीं मिला"। (0)

<ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}"> 
    ... 
     <Setter Property="ContextMenu"> 
      <Setter.Value> 
       <ContextMenu> 
        <MenuItem Header="Remove Group" cal:Message.Attach="DeleteGroup"/> 
       </ContextMenu> 
      </Setter.Value> 
     </Setter> 
    </Style> 

मैंने नीचे दिए गए व्यूमोडेल में लक्ष्य विधि को कोड किया है।

public void DeleteGroup() { //ToDo 
    ... 
} 

ViewModel UserControl के DataContext जिसमें ListBox है वहाँ के रूप में स्थापित किया जाएगा।

उपरोक्त कोड "विधि के लिए कोई लक्ष्य नहीं मिला"। मुझे यकीन नहीं है कि यह क्यों काम नहीं करता है। मैं भी निम्नलिखित भिन्नता

<MenuItem Header="Remove Group" cal:Message.Attach="DeleteGroup" 
      cal:Action.Target="{Binding ElementName=UCRelayDispositionView, Path=DataContext}"> 

जहां UCRelayDispositionView UserControl का नाम है की कोशिश की है।

उपर्युक्त कोड क्यों काम नहीं करता है?

संपादित करें: 1 इसके अलावा निम्नलिखित

<MenuItem Header="Remove Group" cal:Message.Attach="DeleteGroup" 
      cal:Action.TargetWithoutContext="{Binding ElementName=UCRelayDispositionView, Path=DataContext}"> 

और इस

<MenuItem Header="Remove Group" cal:Message.Attach="DeleteGroup" 
      cal:Action.TargetWithoutContext="{Binding ElementName=UCRelayDispositionView}"> 

संपादित करने की कोशिश की: 2 मैं ItemContainer पर निम्नलिखित तरीके से टैग का उपयोग करने की कोशिश की है लेकिन यह या तो काम नहीं करता है।

<ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="Tag" Value="{Binding Path=DataContext, ElementName=UCRelayDispositionView}"/> 
     <Setter Property="ContextMenu"> 
      <Setter.Value> 
       <ContextMenu> 
        <MenuItem Header="Remove Group" 
           cal:Message.Attach="DeleteGroup()" 
           cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"/>          
        </ContextMenu> 
      </Setter.Value> 
    </Style> 
</ListBox.ItemContainerStyle> 

संपादित करें 3: बाइंडिंग त्रुटियाँ

System.Windows.Data Error: 40 : BindingExpression path error: 'PlacementTarget' property not found on 'object' ''MenuItem' (Name='')'. BindingExpression:Path=PlacementTarget.Tag; DataItem='MenuItem' (Name=''); target element is 'MenuItem' (Name=''); target property is 'TargetWithoutContext' (type 'Object') 
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=UCRelayDispositionView'. BindingExpression:Path=DataContext; DataItem=null; target element is 'ContextMenu' (Name=''); target property is 'Tag' (type 'Object') 

उत्तर

10

आपकी समस्या में निहित है कि आप एक तत्व है जो एक ही दृश्य पेड़ में जैसे अस्तित्व में नहीं है लक्ष्य बाध्य करने के लिए कोशिश कर रहे हैं आपके पास ContextMenu है जिस पर आइटम रहता है।

सही ढंग से एक कार्य लक्ष्य प्राप्त करने के लिए, आपको ContextMenu s PlacementTarget संपत्ति का उपयोग करने की आवश्यकता है।

XAML

WPF Context Menus in Caliburn Micro

के लिए इतने पर बाहर निम्नलिखित जवाब चेक तो निम्नलिखित XAML काम करना चाहिए:

<MenuItem Header="Blah" cal:Message.Attach="SomeMethod()" cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"> 

यह ContextMenu पर PlacementTarget के लिए देखने के लिए और लक्ष्य निर्धारित करना चाहिए PlacementTarget.Tag (जो ListBoxItem होना चाहिए) के मान के लिए कार्रवाई के लिए।

आप ListBoxItem.Tag सेट करते हैं (जैसा कि आप पहले से ही किया है) पैरेंट कंटेनर की DataContext होने के लिए (ListBox) आप ठीक होना चाहिए

तो टैग बाध्यकारी होना चाहिए:

<Setter Property="Tag" Value="{Binding Path=DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox}}"/> 

उदा पूरी बात होनी चाहिए:

<ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="Tag" Value="{Binding Path=DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox}}"/> 
     <Setter Property="ContextMenu"> 
      <Setter.Value> 
       <ContextMenu cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"> 
        <MenuItem Header="Remove Group" cal:Message.Attach="DeleteGroup()" /> 
       </ContextMenu> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ListBox.ItemContainerStyle> 
+0

आपका कोड काम नहीं करता है। अभी भी एक ही त्रुटि देता है। जहां तक ​​टैग का उपयोग करना है, मैं इसे कहां रखूं? मेरे पास ItemContainerStyle पर यह संदर्भ मेनू है! – Jatin

+0

यदि आपने पोस्ट किए गए एसओ लिंक में एक नज़र डाली है, तो इसे कहां रखा जाए इसका एक उदाहरण है। मूल रूप से आपको संदर्भ मेनू को उत्पन्न करने वाले आइटम को प्राप्त करने के लिए 'ContextMenu.PlacementTarget' प्रॉपर्टी का उपयोग करना होगा और इसके 'डेटाकॉन्टेक्स्ट' से जुड़ना होगा, हालांकि इसके लिए आपको 'टैग' संपत्ति में मूल कंटेनर के 'डेटाकॉन्टेक्स्ट' को हैक करना होगा । यह मेरे लिए काम करता है (यह दृश्य में एक ईवेंट बनाने के लायक हो सकता है ताकि आप मेनू आइटम पर क्लिक करते समय कोड-बैक और डिबग कर सकें। इस तरह आप ऑब्जेक्ट ग्राफ़ का पता लगा सकते हैं और सही बाध्यकारी पथ खोज सकते हैं) – Charleh

+0

मैंने ** EDIT 2 ** के रूप में चिह्नित प्रश्न संपादित किया है। मुझे यकीन नहीं है कि हम टैग को इस तरह सेट करने के लिए स्टाइल का उपयोग कर सकते हैं, लेकिन वही त्रुटि अभी भी बनी हुई है। – Jatin