2011-03-24 26 views
10

XamDataGridXamNumericEditor için XamDataGrid düzenlenebilir hücresinde varsayılan ContextMenu değiştirmeye çalışıyorum. dosyanın arkasındaOlay İşleyicisi Bağlam Menü Öğesine eklenemiyor

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

Kod bu Menuıtem için olay tutamak yerleri içerir:

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

Ama bunu başlattığınızda, ben mesajla istisna yakalamak: İşte

benim XAML-koddur 'System.Windows.Controls.ContextMenu' yazmak için 'System.Windows.Controls.MenuItem' türünde nesne açılamıyor.

Bana yardımcı olabilir misiniz? Teşekkürler.

+0

[bir Setter.Value yapı içinde olay işleyicileri Ayar] olası yinelenen (http://stackoverflow.com/questions/4752273/setting-event-handlers-inside-a- birlikte bu geçebileceği belirleyici değer yapısı) –

cevap

12

bir kaynak olarak ContextMenu eklemeyi deneyin ve bir StaticResource olarak referans ben XamDataGrid yüzden denemeye olamaz yüklü değilse ama şu satırlarda olmalıdır.

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

Alternatif olarak, PlacementTarget sen ContextMenu gerekir almak için bir EventSetter

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

Güncelle

kullanabilirsiniz. Sen CommandParameter olarak

<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

Evet! İlk çözüm mükemmel çalışır! Çok teşekkürler. – Dmitriy

+1

Oh, ikinci çözüm için teşekkürler! Şimdi ContextMenuOpening olayı :) ele alarak çözümün arkasındaki kodu kullanıyorum. – Dmitriy

İlgili konular