使用WPF中的datatemplate将click事件添加到生成的MenuItems

时间:2014-12-29 15:43:41

标签: c# wpf event-handling click code-behind

我根据" BODPresentationRule"的列表动态创建菜单。对象。虽然我可以将它们添加到列表中,但我无法找到如何使用datatemplate将click事件添加到(子)MenuItems。

当我使用First MenuItem中的PolygonShapesMenu_OnClick Click事件时,我可以看到有一个点击,但没有它是哪个subMenuItem。

XAML:

<Menu VerticalAlignment="Center" >
    <MenuItem Name="PolygonShapesMenu" Click="PolygonShapesMenu_OnClick">
        <MenuItem.Header>
            <StackPanel Orientation="Horizontal">
                <Image Source="/Assets/Images/polygon.png" Height="24" Width="24"></Image>
                <Label>Polygoon</Label>
            </StackPanel>
        </MenuItem.Header>
    </MenuItem>
</Menu>

背后的代码(创建菜单) [注意,由于应用程序的性质,我没有使用MVVM(大量绘图等......)

// create and set the datatemplate
DataTemplate polyDataTemplate = new DataTemplate(typeof (BODPresentationRule));
PolygonShapesMenu.ItemTemplate = polyDataTemplate;

// create and add the text box to the data template
var txtElement = new FrameworkElementFactory(typeof(TextBlock));
polyDataTemplate.VisualTree = txtElement;

// set the binding in the text box bound to the name of the BodPresentationRule
txtElement.SetBinding(TextBlock.TextProperty, new Binding("Name"));

// TODO: how to intercept click event to the current selected item?

// add items to menu
foreach (BODPresentationRule rule in _presentationRules.OrderBy(r=>r.Name))
{
    PolygonShapesMenu.Items.Add(rule);
}

仅供参考,结果如下:

example of menu

我正在考虑使用触发器拦截将添加到数据模板的点击事件,但我甚至不确定这是否是正确的方法。

总结:我需要知道BODPresentationRule(MenuItem)被点击了什么;如何拦截指向该规则的正确点击事件。

1 个答案:

答案 0 :(得分:3)

您只需处理&#34;标题&#34; MenuItem在这里。将Click处理程序放入MenuItem的ItemContainerStyle内的Style中。

<MenuItem>
    <MenuItem.ItemContainerStyle>
        <Style TargetType="{x:Type MenuItem}">
            <EventSetter Event="Click" Handler="PolygonShapesMenu_OnClick"/>
        </Style>
    </MenuItem.Resources>
</MenuItem>

点击的子MenuItem将成为发件人。