Определение элемента списка, по которому щелкают в списке при выполнении контекстного меню - PullRequest
0 голосов
/ 27 июля 2011

Я пытаюсь использовать контекстное меню в списке для запуска некоторого кода. Это требует данных, из какого элемента он возник. Элемент контекстного меню события щелчка показывает сообщение MSG, но я обнаружил, что он не имеет доступа к исходному элементу списка.

<Canvas x:Name="LeftCanvas"  Grid.Column="0" Grid.Row="1" Margin="5,0,0,0">
    <StackPanel>
        <TextBlock Text="Unseated Guests" Background="Blue" Foreground="White" FontFamily="Verdana" FontSize="11" FontWeight="Bold" Height="17" Width="150" HorizontalAlignment="Left" TextAlignment="Center"  Padding="0,4,5,2"></TextBlock>
        <ListBox x:Name="UnseatedPersons" ItemsSource="{Binding}" Height="218"  Width="150" BorderBrush="Blue" BorderThickness="2" HorizontalAlignment="Left" Padding="3,2,2,2" src:FloorPlanClass.DragEnabled="true" MouseEnter="UnseatedPersons_MouseEnter"
             MouseLeave="SourceListBox_MouseLeave">
            <ListBox.ItemTemplate>
                <DataTemplate>
                        <DockPanel>
                            <DockPanel.ContextMenu>
                                <ContextMenu>
                                    <MenuItem Header="Archive Info" Click="bt_click" />
                                    <MenuItem Header="Guest Info" />
                                </ContextMenu>
                            </DockPanel.ContextMenu>
                            <Image Name="imgPerson" Source="{Binding ImagePath}" />
                            <TextBlock Name="txtPersonName" Text="{Binding PersonName}" Padding="2,4,0,0" />
                        </DockPanel>
                    </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>            
</Canvas>

C #:

void bt_click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("my message");
}

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Используйте отправителя, приведя их к MenuItem.Нравится:

void bt_click(object sender, RoutedEventArgs e) 
{ 
    MenuItem originalItem = (MenuItem)sender;
    MessageBox.Show(string.Format("clicked from \"{0}\"", originalItem.Name)); 
}
1 голос
/ 27 июля 2011
  1. Отправителем в событии щелчка будет MenuItem, по которому вы щелкнули.
  2. Его родителем будет ContextMenu
  3. PlacementTarget из ContextMenu будет DockPanel.
  4. У DockPanel будет ListBoxItem как предка в Визуальном Дереве

Таким образом, чтобы получить ListBoxItem в событии click, вы можете использовать что-то похожее на это

private void bt_click(object sender, RoutedEventArgs e)
{
    MenuItem clickedMenuItem = sender as MenuItem;
    ContextMenu contextMenu = clickedMenuItem.Parent as ContextMenu;
    DockPanel dockPanel = contextMenu.PlacementTarget as DockPanel;
    ListBoxItem listBoxItem = GetVisualParent<ListBoxItem>(dockPanel);
    MessageBox.Show(listBoxItem.ToString());

    // Update. To display the content of the ListBoxItem
    MessageBox.Show(listBoxItem.Content.ToString());
}

public static T GetVisualParent<T>(object childObject) where T : Visual
{
    DependencyObject child = childObject as DependencyObject;
    // iteratively traverse the visual tree
    while ((child != null) && !(child is T))
    {
        child = VisualTreeHelper.GetParent(child);
    }
    return child as T;
}
...