2008-12-01 9 views
9

Mam MenuItem, którego ItemsSource jest databound do prostej listy ciągów znaków, wyświetla się poprawnie, ale ja walczę, aby zobaczyć, jak mogę obsługiwać zdarzenia kliknięcia dla nich!Jak obsługiwać zdarzenia kliknięcia w menu związanym z danymi w WPF

Oto prosta aplikacja, która pokazuje go:

<Window x:Class="WPFDataBoundMenu.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300"> 
<Grid> 
    <Menu> 
     <MenuItem Header="File" Click="MenuItem_Click" /> 
     <MenuItem Header="My Items" ItemsSource="{Binding Path=MyMenuItems}" /> 
    </Menu> 
</Grid> 

using System.Collections.Generic; 
using System.Windows; 

namespace WPFDataBoundMenu 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     public List<string> MyMenuItems { get; set;} 

     public Window1() 
     { 
      InitializeComponent(); 
      MyMenuItems = new List<string> { "Item 1", "Item 2", "Item 3" }; 
      DataContext = this; 
     } 

     private void MenuItem_Click(object sender, RoutedEventArgs e) 
     { 
      MessageBox.Show("how do i handle the other clicks?!"); 
     } 
    } 
} 

Dziękujemy!

Chris.

Odpowiedz

12
<MenuItem Header="My Items" ItemsSource="{Binding Path=MyMenuItems}" Click="DataBoundMenuItem_Click" /> 

Code tyłu ..

private void DataBoundMenuItem_Click(object sender, RoutedEventArgs e) 
{ 
    MenuItem obMenuItem = e.OriginalSource as MenuItem; 
    MessageBox.Show(String.Format("{0} just said Hi!", obMenuItem.Header)); 
} 

wydarzenia będą bańka do wspólnej obsługi. Następnie można użyć w nagłówku lub lepsze właściwości DataContext do przełącznika i działać jako niezbędnego

4

Możesz kazać każdej pozycji menu wykonać to samo polecenie, tym samym wykonując operację centralnie. Jeśli trzeba odróżnić elementy menu poza rzeczywistą instancji obiektu, można powiązać parametr polecenia też:

<MenuItem Header="My Items" ItemsSource="{Binding Path=MyMenuItems}"> 
    <MenuItem.ItemContainerStyle> 
     <Style TargetType="MenuItem"> 
      <Setter Property="Command" Value="{x:Static local:MyCommands.MyCommand}"/> 
      <Setter Property="CommandParameter" Value="{Binding SomeProperty}"/> 
     </Style> 
    </MenuItem.ItemContainerStyle> 
</MenuItem> 

SomeProperty wyniesie nieruchomości na każdej pozycji w swojej kolekcji MyMenuItems. Twój program obsługi wykonywania poleceń otrzyma wartość SomeProperty dla danego klikniętego elementu menu.

+0

Byłoby jeszcze doprowadzić do centralnego przewodnika, który przełącza się na wartości SomeProperty. prawda? – Gishu

+0

Tak, zgadza się. W rzeczywistości parametr nie jest obowiązkowy. Można utworzyć rozgałęzienie na podstawie instancji MenuItem, ale okazało się, że często jest wymagana konkretna część danych dla każdego elementu menu. na przykład. rozważ najnowsze pozycje menu pliku. Ważną informacją jest ścieżka do pliku. –

+0

Gdy to przetestuję, polecenie zostanie uruchomione po kliknięciu lewym i prawym przyciskiem myszy. Jak ustalić, który przycisk został naciśnięty w poleceniu? – keft

1

IMHO bardziej ogólnej obsługi zdarzeń z możliwością, aby uzyskać pozycję z ItemsSource

private void DataBoundMenuItem_Click(object sender, RoutedEventArgs e) 
{ 
    // get menu item with ItemsSource bound 
    var myItemsMenuItems = sender as MenuItem; 

    // get submenu clicked item constructed from MyMenuItems collection 
    var myItemsMenuSubItem = e.OriginalSource as MenuItem; 

    // get underlying MyMenuItems collection item 
    var o = myItemsMenuItems 
     .ItemContainerGenerator 
     .ItemFromContainer(myItemsMenuSubItem); 
    // convert to MyMenuItems type ... in our case string 
    var itemObj = o as (string); 

    // TODO some processing 
} 

Nadzieja it'l pomóc smbd!

0

Jeśli chcesz prostszy sposób dostępu do treści elementu menu:

<MenuItem Header="My Items" ItemsSource="{Binding Path=MyMenuItems}" Click="MenuItem_Click"> 
    <MenuItem.ItemContainerStyle> 
     <Style TargetType="MenuItem"> 
      <Setter Property="CommandParameter" Value="{Binding}" /> 
     </Style> 
    </MenuItem.ItemContainerStyle> 
</MenuItem> 

Cod Za:

private void MenuItem_Click(object sender, RoutedEventArgs e) 
{ 
    var item = ((MenuItem)e.OriginalSource).CommandParameter; 
} 
Powiązane problemy