![](/img/trans.png)
[英]How to reference right-clicked object in WPF Context Menu item click event handler?
[英]Programmatically add a context menu whose Click handler knows which item was right-clicked
我正在動態生成一棵樹( TreeViewItem
),並希望向樹中的每個項目添加相同的上下文菜單。 因為所有上下文菜單都是相同的,所以我想可以制作一個並將其應用於每個TreeViewItem
。 (也許這是個壞主意?)只要Click
處理程序可以弄清楚哪個TreeViewItem
的上下文菜單已打開,這種方法就應該起作用。
我嘗試從此處 (獲取右鍵單擊的對象)和此處 (以編程方式添加綁定)組合SO答案,並提出了以下解決方案:
ContextMenu carContextMenu;
public MainWindow()
{
InitializeComponent();
Initialize();
ConstructTree();
}
void ConstructTree()
{
string[] carNames = {"Mustang", "Viper", "Jetta"};
foreach (string car in carNames)
{
TreeViewItem carNode = new TreeViewItem();
carNode.Header = car;
carNode.ContextMenu = carContextMenu;
CarTree.Items.Add(carNode);
}
}
void Initialize()
{
carContextMenu= new ContextMenu();
MenuItem newQuery = new MenuItem();
newQuery.Header = "Drive car...";
Binding b = new Binding("Parent");
b.RelativeSource = RelativeSource.Self;
newQuery.SetBinding(MenuItem.CommandParameterProperty, b);
newQuery.Click += NewQuery_Click;
carContextMenu.Items.Add(newQuery);
}
void NewQuery_Click(object sender, RoutedEventArgs e)
{
MenuItem mi = sender as MenuItem;
if (mi != null)
{
ContextMenu cm = mi.CommandParameter as ContextMenu; // *****
if (cm != null)
{
TreeViewItem node = cm.PlacementTarget as TreeViewItem;
if (node != null)
{
Console.WriteLine(node.Header); // car name, ideally
}
}
}
}
在運行時,當到達帶星號的行時, mi.CommandParameter
為null,因此它將跳過該方法的其余部分。 我的方法是怎么回事? 老實說,考慮到您想知道被單擊的次數,右鍵單擊的項目不是事件處理程序參數的固有部分,我感到有些驚訝。 右鍵單擊時不需要選擇樹項,因此檢查這不是一種可靠的方法...此外,這只是一個棘手的解決方法。
謝謝!
自然地,事實證明我使事情變得過於復雜,並且我所關注的鏈接要么不正確,已過時,要么(很可能)我誤解了他們的部分情況,並且有些事情實際上不適用於我。
我不需要對MenuItem
本身進行任何綁定,而應該一直都在查看myMenuItem.Parent.PlacementTarget
。 下面的工作代碼:
void Initialize()
{
carContextMenu= new ContextMenu();
MenuItem newQuery = new MenuItem();
newQuery.Header = "Drive car...";
newQuery.Click += NewQuery_Click;
carContextMenu.Items.Add(newQuery);
}
void NewQuery_Click(object sender, RoutedEventArgs e)
{
MenuItem mi = sender as MenuItem;
if (mi != null)
{
ContextMenu cm = mi.Parent as ContextMenu;
if (cm != null)
{
TreeViewItem node = cm.PlacementTarget as TreeViewItem;
if (node != null)
{
Console.WriteLine(node.Header);
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.