我早些时候问了一个关于同样事情的问题,但我还有另外一个问题。
我需要有关动态菜单的帮助。我想得到"路径"菜单中的对象。
这是我的wpf,你可以看到我绑定的值=" {绑定名称}" />因为我想在菜单中显示名称,而不是路径:
<Menu HorizontalAlignment="Left" Height="30" VerticalAlignment="Top" Width="525" IsMainMenu="True">
<MenuItem Header="Menu" x:Name="myList" Click="myList_Click">
<MenuItem.ItemContainerStyle>
<Style>
<Setter Property="MenuItem.Header" Value="{Binding name}"/>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
</Menu>
我用&#34; this.myList.ItemsSource = list;&#34;绑定了一个集合,它显示了我的动态菜单,所以这里是我的mainwindow.cs:
public MainWindow()
{
var list = new List<History>
{
new History() { name = "Guy1", path = "C:/F1/}"},
new History() { name = "Guy2", path = "C:/F2/"},
new History() { name = "Guy3", path = "C:/F3/"},
new History() { name = "Guy4", path = "C:/F4"},
};
InitializeComponent();
this.myList.ItemsSource = list;
}
private void myList_Click(object sender, RoutedEventArgs e)
{
DependencyObject obj = (DependencyObject)e.OriginalSource;
while (obj != null && obj != myList)
{
if (obj.GetType() == typeof(MenuItem))
{
MessageBox.Show((e.OriginalSource as MenuItem).Header.ToString());
break;
}
obj = VisualTreeHelper.GetParent(obj);
}
}
这是一个简单的课程,我命名为#34;历史&#34;:
namespace MediaPlayer
{
public class History
{
// "prop" puis "tab"
public String name { get; set; }
public String path { get; set; }
public int time { get; set; }
public override string ToString()
{
return path;
}
}
}
我想要做的是当我点击,例如,Guy1,我希望我的软件显示一条消息,说明&#34; C:/ F1 /&#34;因为它是Guy1,对于GUY2我想要&#34; C:/ F2 /&#34;。
你知道吗?你知道我怎么能用这样的东西来接近我对象的路径? :MessageBox.Show((e.OriginalSource as MenuItem).Header.ToString());感谢。
编辑:
<Menu HorizontalAlignment="Left" Height="30" VerticalAlignment="Top" Width="525" IsMainMenu="True">
<MenuItem Header="Menu" x:Name="myList" Click="myList_Click">
<MenuItem.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<EventSetter Event="Click" Handler="MyItemClick"/>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
</Menu>
答案 0 :(得分:1)
(简易解决方案)
您可以在EventSetter
Style
内使用MenuItem
。语法如下:
<EventSetter Event="Click" Handler="MyItemClick" />
在事件处理程序代码中,您可以找到单击的项目:
public void MyItemClick(object sender, EventArgs e)
{
var clickedMenuItem = (MenuItem)sender;
var clickedHistoryItem = (History)clickedMenuItem.DataContext;
//do stuff with whatever "guy" was clicked
}
(更高级选项)
请注意,使用MVVM Pattern,您可以在历史记录项中创建一个Command对象,并从那里处理您需要处理的任何内容。语法如下:
<Setter Property="Command" Value="{Binding ClickCommand}" />
您可以查看MVVM模式,但学习曲线非常陡峭。一旦你的程序成长,它将定义得到回报。