Как обрабатывать события кликов в связанном с данными меню в WPF - PullRequest
10 голосов
/ 01 декабря 2008

У меня есть MenuItem, чей ItemsSource привязан к простому списку строк, он правильно отображается, но я изо всех сил пытаюсь понять, как я могу обработать события щелчка для них!

Вот простое приложение, которое демонстрирует это:

<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?!");
        }
    }
}

Большое спасибо!

Крис.

Ответы [ 4 ]

14 голосов
/ 01 декабря 2008
<MenuItem Header="My Items" ItemsSource="{Binding Path=MyMenuItems}" Click="DataBoundMenuItem_Click" />

Код позади ..

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

События будут пузыриться до общего обработчика. Затем вы можете использовать текст заголовка или лучше свойство DataContext для переключения и действовать по мере необходимости

5 голосов
/ 01 декабря 2008

Вы могли бы, чтобы каждый пункт меню выполнял одну и ту же команду, таким образом обрабатывая выполнение централизованно. Если вам нужно отличить пункты меню от фактического экземпляра объекта, вы также можете привязать параметр команды:

<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 считается свойством каждого элемента в вашей коллекции MyMenuItems. Следовательно, ваш обработчик выполнения команды получит значение SomeProperty для определенного пункта меню, по которому щелкают.

1 голос
/ 04 октября 2013

ИМХО более общий обработчик событий с возможностью получения элемента из источника элементов

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
}

Надеюсь, это поможет кому-то!

0 голосов
/ 18 января 2016

Если вам нужен более простой способ доступа к содержимому пункта меню:

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

треска сзади:

private void MenuItem_Click(object sender, RoutedEventArgs e)
{
   var item = ((MenuItem)e.OriginalSource).CommandParameter;   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...