我有一个动态menuItem但我无法从此菜单中获取对象字段

时间:2014-12-17 17:13:13

标签: c# wpf menuitem

我早些时候问了一个关于同样事情的问题,但我还有另外一个问题。

我需要有关动态菜单的帮助。我想得到"路径"菜单中的对象。

enter image description here

这是我的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>

1 个答案:

答案 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模式,但学习曲线非常陡峭。一旦你的程序成长,它将定义得到回报。