【问题标题】:(WPF)how to raise Datatemplate's Context MenuItem event(WPF)如何引发 Datatemplate 的 Context MenuItem 事件
【发布时间】:2010-02-23 14:51:28
【问题描述】:

我有一个列表框及其数据模板。列表框的项目与静态源绑定。在数据模板中,我有一个按钮,并创建了它的上下文菜单和一些菜单项。

<ObjectDataProvider x:Key="GlobalUnits"/>
<DataTemplate x:Key="listboxTemplate" DataType="UnitClass">
      <StackPanel Margin="3" >
        <DockPanel >
          <Button DockPanel.Dock="Left" Margin="5,0,10,0">
            <Button.ContextMenu>
              <ContextMenu x:Name="CMUnits"  Opened="OnContextMenuOpened"
                     MenuItem.Click="OnMenuItemClick">
                <MenuItem Header="Add"
                      x:Name="MenuItemName" />
                <MenuItem Header="Delete"
                      x:Name="MenuItemDelete" />                
              </ContextMenu>
            </Button.ContextMenu>
          </Button>          
        </DockPanel>        
      </StackPanel>
    </DataTemplate>
<ListBox x:Name="TUListBox"
         local:DragDropManager.DragSourceAdvisor="{StaticResource sourceAdvisor}"
         ItemTemplate="{DynamicResource listboxTemplate}"
         ItemsSource="{Binding Source={StaticResource GlobalUnits}}"/>

In Code behind:

void OnMenuItemClick(object sender, RoutedEventArgs e)
        {
           if (e.Source == this.MenuItemDelete) <//error  here MenuItemDelete is not available
            {
            }
        }

我在 datatemplate 中为一个按钮定义了 MenuItemDelete 作为菜单项。任何建议,如果我将上下文菜单放在普通 xaml 代码中的数据模板之外,它就可以工作。

当我在运行时单击菜单项时,我的程序调试光标甚至没有到达 OnMenuItemClick 事件

谢谢。

【问题讨论】:

    标签: c# wpf binding


    【解决方案1】:

    您的问题有更好的解决方案,涉及使用命令(您应该研究一下),但这是我创建的一个示例,它演示了这个工作。这是 XAML:

    <Window x:Class="TestWpfApplication.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window15" Height="300" Width="300"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
        <Window.Resources>
            <DataTemplate x:Key="testTemplate">
                <StackPanel Margin="3">
                    <DockPanel>
                        <Button DockPanel.Dock="Left" Margin="5,0,10,0" Content="{Binding}">
                            <Button.ContextMenu>
                                <ContextMenu x:Name="CMUnits" MenuItem.Click="OnMenuItemClick">
                                    <MenuItem Header="Add"
                                              x:Name="MenuItemAdd" />
                                    <MenuItem Header="Delete"
                                              x:Name="MenuItemDelete" />
                                </ContextMenu>
                            </Button.ContextMenu>
                        </Button>
                    </DockPanel>
                </StackPanel>
            </DataTemplate>
        </Window.Resources>
        <Grid>
            <ListBox ItemTemplate="{StaticResource testTemplate}"
                     ItemsSource="{Binding TestItems}"/>
        </Grid>
    </Window>
    

    下面是代码:

    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
    
        public ObservableCollection<string> TestItems
        {
            get
            {
                return new ObservableCollection<string>()
                {
                    "Item 1", "Item 2", "Item 3"
                };
            }
        }
    
        private void OnMenuItemClick(object sender, RoutedEventArgs e)
        {
            MenuItem item = e.Source as MenuItem;
            if (item.Name == "MenuItemDelete")
            {
                // Delete the item.
            }
            else if (item.Name == "MenuItemAdd")
            {
                // Add the item.
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 2010-10-10
      • 2013-12-15
      • 1970-01-01
      • 2015-02-02
      相关资源
      最近更新 更多