2011-03-24 16 views
10

में कॉन्टेक्स्ट मेनू आइटम में ईवेंट हैंडलर संलग्न नहीं कर सकता हैसंपादन योग्य सेल पर XamNumericEditor के लिए डिफ़ॉल्ट ContextMenu को संशोधित करने का प्रयास कर रहा हूं।स्टाइल

<igDP:XamDataGrid.Resources> 
    <Style TargetType="{x:Type editors:XamNumericEditor}"> 
    <Setter Property="ContextMenu"> 
     <Setter.Value> 
     <ContextMenu> 
      <ContextMenu.Items> 
      <MenuItem Header="Select All" 
         Command="SelectAll"> 
       <MenuItem.Icon> 
       <Image Source="..\icons\table_select_all.png"/> 
       </MenuItem.Icon> 
      </MenuItem> 
      <MenuItem Header="Accept for column" 
         Click="MenuItem_Click"> 
      </MenuItem> 
      </ContextMenu.Items> 
     </ContextMenu> 
     </Setter.Value> 
    </Setter> 
    </Style> 
</igDP:XamDataGrid.Resources> 

फ़ाइल के पीछे कोड इस MenuItem के लिए घटना Hadler शामिल हैं::

private void MenuItem_Click(object sender, RoutedEventArgs e) 
{ 
//... 
} 

लेकिन जब मैं इसे शुरू, मैं संदेश के साथ एक अपवाद को पकड़ने:

यहाँ मेरी XAML-कोड है 'System.Windows.Controls.ContextMenu' टाइप करने के लिए 'System.Windows.Controls.MenuItem' प्रकार की ऑब्जेक्ट डालने में असमर्थ।

क्या आप इसके साथ मेरी सहायता कर सकते हैं? धन्यवाद।

+0

[एक Setter.Value संरचना के भीतर ईवेंट हैंडलर्स स्थापना] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/4752273/setting-event-handlers-inside-a- इस गुजारें सकता सेटर-वैल्यू-स्ट्रक्चर) –

उत्तर

12

एक संसाधन के रूप में ContextMenu जोड़ने के लिए प्रयास करें और के रूप में एक StaticResource संदर्भ यह मैं XamDataGrid स्थापित तो मैं यह कोशिश नहीं कर सकते हैं की जरूरत नहीं है, लेकिन यह निम्नलिखित लाइनों के साथ होना चाहिए।

<igDP:XamDataGrid.Resources> 
    <ContextMenu x:Key="contextMenu"> 
     <ContextMenu.Items> 
      <MenuItem Header="Select All" 
         Command="SelectAll"> 
       <MenuItem.Icon> 
        <Image Source="..\icons\table_select_all.png"/> 
       </MenuItem.Icon> 
      </MenuItem> 
      <MenuItem Header="Accept for column" 
         Click="MenuItem_Click"></MenuItem> 
     </ContextMenu.Items> 
    </ContextMenu> 
    <Style TargetType="{x:Type editors:XamNumericEditor}"> 
     <Setter Property="ContextMenu" Value="{StaticResource contextMenu}"/> 
    </Style> 
</igDP:XamDataGrid.Resources> 

वैकल्पिक रूप से, आप

इस्तेमाल कर सकते हैं एक EventSetter

<MenuItem Header="Accept for column"> 
    <MenuItem.Style> 
     <Style TargetType="MenuItem"> 
      <EventSetter Event="Click" Handler="MenuItem_Click"/> 
     </Style> 
    </MenuItem.Style> 
</MenuItem> 

अद्यतन प्राप्त करने के लिए PlacementTarget आप ContextMenu की आवश्यकता होगी। आप के साथ के रूप में CommandParameter

<MenuItem Header="Accept for column" 
      CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}" 
      Click="MenuItem_Click"> 
</MenuItem> 

private void MenuItem_Click(object sender, RoutedEventArgs e) 
{ 
    MenuItem menuItem = sender as MenuItem; 
    ContextMenu contextMenu = menuItem.CommandParameter as ContextMenu; 
    var placementTarget = contextMenu.PlacementTarget; 
    //... 
} 
+1

हाँ! पहला समाधान पूरी तरह से काम करता है! बहुत धन्यवाद। – Dmitriy

+1

ओह, दूसरे समाधान के लिए भी धन्यवाद! अब मैं ContextMenuOpening घटना को संभालने के साथ समाधान के पीछे कोड का उपयोग करें :)। – Dmitriy

संबंधित मुद्दे