C# 将参数传递给图像绑定

C# 将参数传递给图像绑定,c#,wpf,xaml,binding,parameters,C#,Wpf,Xaml,Binding,Parameters,我有几个这样的菜单项: <navigation:RadMenuItem Header="New Assignment"> <navigation:RadMenuItem.Icon> <Image Source="/Images/New_Assignment.jpeg" Width="20" Height="20" /> </navigation:RadMenuItem.Icon> </navigation:Ra

我有几个这样的菜单项:

<navigation:RadMenuItem Header="New Assignment">
    <navigation:RadMenuItem.Icon>
        <Image Source="/Images/New_Assignment.jpeg" Width="20" Height="20" />
    </navigation:RadMenuItem.Icon>
</navigation:RadMenuItem>
<navigation:RadMenuItem Header="New Course">
    <navigation:RadMenuItem.Icon>
        <Image Source="/Images/New_Course.jpeg" Width="20" Height="20" />
    </navigation:RadMenuItem.Icon>
</navigation:RadMenuItem>
<navigation:RadMenuItem Header="New Folder">
    <navigation:RadMenuItem.Icon>
        <Image Source="/Images/New_Folder.jpeg" Width="20" Height="20" />
    </navigation:RadMenuItem.Icon>
</navigation:RadMenuItem>

请注意,我必须为每个项目设置图标。(所有图标都在/Images/文件夹中)那么我如何传递一个参数,以便我可以说:

<navigation:RadMenuItem Header="New Assignment" Icon="{Binding ImageCollection, param1=New_Assignment.jpeg}" />


其中ImageCollection是/images/文件夹中的图像集合。

我认为理想的方法是使用绑定到导航菜单项集合的数据绑定列表框:

<ListBox DataContext="{Binding MyCollectionOfNavigationItems}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <navigation:RadMenuItem Header="{Binding Header}" Icon="{Binding ImagePath, Converter={StaticResource PathToImageConverter}}"
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
并使用自定义转换器将图像路径转换为图像(您也可以简单地拥有在代码中创建的图像属性)


如果这不是一个选项,您可能可以使用多重绑定和附加属性来完成,但是如果您仍然要为每个项编写多重绑定语法,那将更加冗长。

有一个解决方案

您可以使用类型的字典作为ImageCollection变量,如下所示:

public Dictionary< string, ImageSource> ImageCollection{ get; set; }
现在,您可以开始构建图像集合,如下所示:

ImageCollection = new Dictionary< string, ImageSource>
{
    { "New_Assignment", new BitmapImage(BASE_ADDR + "/New_Assignment.jpeg") }
    ...
    ...
}
ImageCollection=newdictionary
{
{“New_Assignment”,新位图图像(BASE_ADDR+“/New_Assignment.jpeg”)}
...
...
}
现在,在XAML中,您可以像这样绑定:

public class NavigationItem {
    public string Header { get; set; }
    public string ImagePath { get; set; }
}
<navigation:RadMenuItem
  Header="New Assignment"
  Icon="{Binding ImageCollection[New_Assignment]}" />


这应该很有效。编码愉快。

谢谢!这就成功了。但我还有一个问题:我必须手动将图像的大小调整为20宽20高。如何设置图像的宽度和高度属性。可能像:公共字典ImageCollection{get;set;}?不幸的是,字典只适用于成对元组,所以即使您想添加第三个元组,也无法添加第三个元组。这是C#的限制,集合只能由一个元素索引。从长远来看,手动设置图像大小可能是一件好事。。。有时你不能事事顺心=p可以用like图标替换ImageSource吗?你可以在字典中存储任何你喜欢的东西。
<navigation:RadMenuItem
  Header="New Assignment"
  Icon="{Binding ImageCollection[New_Assignment]}" />