2

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

<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>

但silverlight似乎不喜欢那样

有任何想法吗?

4

3 回答 3

0

我以编程方式创建了一个上下文菜单,并将内容设置为 MenuItem.Header 属性似乎适用于图像。有很多设置文本的例子

于 2010-10-29T03:19:54.310 回答
0

尝试改用这个开源菜单:

http://sl4popupmenu.codeplex.com

该模板允许直接绑定图像。希望这可以帮助。

于 2010-11-05T08:52:44.873 回答
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# 代码隐藏

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是我在这里详细描述的一些东西,但这并不是很重要。您可以推出自己的价值转换器并使用它。

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

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

我希望这有帮助!

于 2011-03-05T16:11:40.763 回答