我正在动态生成一个树形结构(
我尝试结合此处(获取右键单击的对象)和此处(以编程方式添加绑定)的SO答案,并得出以下结论:
在运行时,当到达带有星号的那一行时,
谢谢!
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
为空,因此跳过了方法的其余部分。我的方法出了什么问题?说实话,我有点惊讶右键单击的项目不是事件处理程序参数的固有部分,考虑到你经常想知道点击了什么。右键单击树形项时并不一定会选择它们,因此检查它们并不是一种可靠的方法...而且这只是一个 hacky 的解决方法。谢谢!
CommandParameter="{Binding RelativeSource={RelativeSource Self}}">
- MethodMan