将参数传递给图像绑定

时间:2010-02-08 22:49:33

标签: 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: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 /文件夹中的图像集合。

2 个答案:

答案 0 :(得分:2)

您的问题有解决方案。

您使用的类型字典&lt; string,ImageSource&gt;像你的ImageCollection变量一样:

public Dictionary< string, ImageSource> ImageCollection{ get; set; }

现在要构建集合,必须使用有效的URI指定正确的ImageSource。

您从基本地址开始,在您的情况下为“/ Images”,以便您可以在代码的某一点更改基址,而不必查找所有出现的图像地址...只是为了方便。 / p>

const readonly string BASE_ADDR = "/Images";

现在您可以开始构建您的图像集:

ImageCollection = new Dictionary< string, ImageSource>
{
    { "New_Assignment", new BitmapImage(BASE_ADDR + "/New_Assignment.jpeg") }
    ...
    ...
}

现在在您的XAML中,您可以像这样绑定:

<navigation:RadMenuItem
  Header="New Assignment"
  Icon="{Binding ImageCollection[New_Assignment]}" />

这应该很好用。快乐的编码。

答案 1 :(得分:0)

我认为理想的方法是使用绑定到Naviation菜单项集合的数据绑定ListBox:

<ListBox DataContext="{Binding MyCollectionOfNavigationItems}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <navigation:RadMenuItem Header="{Binding Header}" Icon="{Binding ImagePath, Converter={StaticResource PathToImageConverter}}"
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

并将其绑定到可能构造如下的项目集合:

public class NavigationItem {
    public string Header { get; set; }
    public string ImagePath { get; set; }
}

并使用自定义转换器将图像路径转换为图像(您也可以只使用在代码中创建的图像属性)。

如果这不是一个选项,你可以使用MultiBinding和附加属性来做,但如果你仍然为每个项目写出MultiBinding语法,那就更加冗长了。