如何将菜单项绑定到silverlight中的ContextMenu,包括图标
我有一个上下文菜单,我希望它的菜单项通过绑定填充。 下面的代码可以工作如何将菜单项绑定到silverlight中的ContextMenu,包括图标,silverlight,xaml,icons,contextmenu,itemssource,Silverlight,Xaml,Icons,Contextmenu,Itemssource,我有一个上下文菜单,我希望它的菜单项通过绑定填充。 下面的代码可以工作 <Button> <controlsInputToolkit:ContextMenuService.ContextMenu> <controlsInputToolkit:ContextMenu ItemsSource="{Binding MenuItems}"> <controlsInputToolkit:ContextMenu.Ite
<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似乎不喜欢这样
有什么想法吗?我创建了一个上下文菜单,并将内容设置为MenuItem.Header属性对于图像来说似乎效果不错。有很多设置文本的方法。我创建了一个上下文菜单,并将内容设置为MenuItem.Header属性似乎对图像很有效。有许多文本设置。请尝试使用此开源菜单: 该模板允许直接绑定图像。
希望这有帮助。尝试使用此开源菜单: 该模板允许直接绑定图像。
希望这能有所帮助。我也有同样的问题,虽然我没有找到我想要的答案,但我找到了一个很好地满足我需要的解决方法。我想你可能会喜欢看它,即使是在事实发生这么久之后 如果
ContextMenu
类的ItemsSource
包含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)
{
}
private void OnBindingContextMenu(对象发送者,ValueConvertingEventArgs e)
{
var dataitems=e.值为IEnumerable;
如果(数据项!=null)
{
var items=dataitems.Select(data=>newmenuitem()
{
Header=data.Title,
Icon=data.Icon,
标记=数据
}).ToList();
var handler=newroutedEventHandler(this.OnContextMenuClick);
items.ForEach(item=>item.Click+=handler);
e、 结果=项目
}
}
私有void OnContextMenuClick(对象发送方,RoutedEventArgs e)
{
}
讨论
DelegatedValueConverter
是我详细描述的一点东西,但它并不重要。您可以使用自己的值转换器来代替它
我的视图模型的Title
属性是一个字符串,Icon
是Image
的一个实例。我使用菜单项的标记
属性保留对视图模型的引用,以便在单击事件期间可以引用其中的非可视数据
这个解决方案很方便,因为它仍然在UI和视图模型之间提供了一些分离,尽管在本例中我更喜欢纯声明性的解决方案
我希望这有帮助 我也有同样的问题,虽然我没有找到我想要的答案,但我找到了一个很好地满足我需要的解决办法。我想你可能会喜欢看它,即使是在事实发生这么久之后 如果
ContextMenu
类的ItemsSource
包含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)
{
}
private void OnBindingContextMenu(对象发送者,ValueConvertingEventArgs e)
{
var dataitems=e.值为IEnumerable;
如果(数据项!=null)
{
var items=dataitems.Select(data=>newmenuitem()
{
Header=data.Title,
Icon=data.Icon,
标记=数据
}).ToList();
var handler=newroutedEventHandler(this.OnContextMenuClick);
items.ForEach(item=>item.Click+=handler);
e、 结果=项目
}
}
私有void OnContextMenuClick(对象发送方,RoutedEventArgs e)
{
}
讨论
DelegatedValueConverter
是我详细描述的一点东西,但它并不重要。您可以使用自己的值转换器来代替它
我的视图模型的Title
属性是一个字符串,Icon
是Image
的一个实例。我使用菜单项的标记
属性保留对视图模型的引用,以便在单击事件期间可以引用其中的非可视数据
这个解决方案很方便,因为它仍然在UI和视图模型之间提供了一些分离,尽管在本例中我更喜欢纯声明性的解决方案
我希望这有帮助 以编程方式创建菜单是可行的,但它打破了我的mvvm模式,这就是为什么我在寻找一些方法来单独绑定创建菜单是可行的,但它打破了我的mvvm模式,这就是为什么我在寻找一些方法来单独绑定