我正在动态生成一棵树TreeViewItem,并希望向树中的每个项目添加相同的上下文菜单。因为所有上下文菜单都是相同的,所以我想我可以制作一个,并将其应用到每个TreeViewItem. (也许这是一个坏主意?)似乎只要Click处理程序可以确定TreeViewItem打开了哪个上下文菜单,就应该可以工作。
我尝试将此处(获取右键单击的对象)和此处(以编程方式添加绑定)的答案结合起来,并得出以下结论:
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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在运行时,当它到达带有星号的行时,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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8438 次 |
| 最近记录: |