[英](WPF)how to raise Datatemplate's Context MenuItem event
我有一個列表框及其數據模板。 列表框的項目與靜態源綁定。 在數據模板中,我有一個按鈕,並創建了它的上下文菜單和一些菜單項。
<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作為按鈕作為menuitem。 任何建議,如果我在普通的XAML代碼中將上下文菜單從datatemplate中移出,它將起作用。
好吧,當我在運行時單擊菜單項時,我的程序調試光標甚至都沒有到達OnMenuItemClick事件
謝謝。
對於您的問題,有更好的解決方案,涉及使用命令(您應該研究一下),但這是我創建的一個示例,演示了此工作。 這是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.
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.