如何将菜单项绑定到silverlight中的ContextMenu,包括图标

时间:2010-10-29 02:57:41

标签: silverlight xaml icons contextmenu itemssource

我有一个上下文菜单,我希望它的菜单项通过绑定填充。 以下代码可以使用

<Button>
    <controlsInputToolkit:ContextMenuService.ContextMenu>
        <controlsInputToolkit:ContextMenu ItemsSource="{Binding MenuItems}">
            <controlsInputToolkit:ContextMenu.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" />
                </DataTemplate>
            </controlsInputToolkit:ContextMenu.ItemTemplate>
        </controlsInputToolkit:ContextMenu>
    </controlsInputToolkit:ContextMenuService.ContextMenu>
</Button>

但是有一个问题,ItemTemplate表示菜单项的文本区域,因此我知道不允许你设置图标

所以我尝试通过ItemContainerStyle进行绑定,如下例

<Button>
    <controlsInputToolkit:ContextMenuService.ContextMenu>
        <controlsInputToolkit:ContextMenu ItemsSource="{Binding MenuItems}">
            <controlsInputToolkit:ContextMenu.ItemContainerStyle>
                <Style TargetType="controlsInputToolkit:MenuItem">
                    <Setter Property="Header" Value="{Binding Name}"/>
                </Style>
            </controlsInputToolkit:ContextMenu.ItemContainerStyle>
        </controlsInputToolkit:ContextMenu>
    </controlsInputToolkit:ContextMenuService.ContextMenu>
</Button>

但银光似乎不喜欢那样

任何想法?

3 个答案:

答案 0 :(得分:0)

我创建了一个上下文菜单programmatically,并将内容设置为MenuItem.Header属性似乎对图像效果很好。设置文字有lot examples

答案 1 :(得分:0)

请尝试使用此开源菜单:

http://sl4popupmenu.codeplex.com

模板允许直接绑定图像。 希望这会有所帮助。

答案 2 :(得分:0)

我有同样的问题,虽然我没有找到我想要的答案,但我发现了一种能很好地满足我需求的解决方法。我以为你可能想看到它,即使是这么久以后。

看来,如果ItemsSource类的ContextMenu包含MenuItem个对象,那么该图标就会很好地归属于它所属的位置。我和你一样,正在使用视图模型而不是将UI逻辑注入到我的视图模型类中。

我所做的是实现一个值转换器,将我的视图模型转换为MenuItem个对象。看起来有点像这样:


<强> XAML:

<UserControl.Resources>
    <local:DelegatedValueConverter
        x:Key="LocalContextItemConverter"
        Converting="OnBindingContextMenu" />
</UserControl.Resources>

...

<toolkit:ContextMenu
    ItemsSource="{Binding ContextMenuItems, Converter={StaticResource LocalContextItemConverter}}" />

C#Code-Behind

private void OnBindingContextMenu(object sender, ValueConvertingEventArgs e)
{
    var dataitems = e.Value as IEnumerable< NavigationItemViewModel >;
    if (dataitems != null)
    {
        var items = dataitems.Select(data => new MenuItem()
        {
            Header = data.Title,
            Icon = data.Icon,
            Tag = data
        }).ToList();
        var handler = new RoutedEventHandler(this.OnContextMenuClick);
        items.ForEach(item => item.Click += handler);
        e.Result = items
    }
}

private void OnContextMenuClick(object sender, RoutedEventArgs e)
{
}

<强>讨论

DelegatedValueConverter是我详细描述的here,但它并不重要。您可以滚动自己的值转换器并使用它。

我的视图模型的Title属性是一个字符串,而IconImage的一个实例。我使用菜单项的Tag属性来保持对视图模型的引用,以便在单击事件期间可以引用其中的非可视数据。

这个解决方案很方便,因为它仍然在UI和视图模型之间提供了一些分离,尽管在这种情况下我更喜欢纯粹的声明性解决方案。

我希望这有帮助!