在列表框中绑定图像

时间:2013-11-19 14:06:44

标签: c# wpf binding listbox

我有一个从数据表中填充的列表框。我希望每个项目在列表框上都有一个特定的图像,但我想根据每个项目的ID设置图像。 例如,我有:

产品

橙色

Apple

ID

1

2

并将图片命名为: Item.1.png Item.2.png

所以,在我的列表框中,我有苹果,我会在其旁边找到名为:Item.2.png的图片。

我的问题是我不知道如何进行条件绑定。我不希望在我的模板上有数百行为每个项目执行此操作。我需要使用条件来执行此操作,例如:if(product.id == 1),Image.Source = Item.1.png。 在wpf中有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

在我看来,您需要一个IdToImageConverter来决定哪个Image应该依赖于Id属性的值来显示。这样的事情可以解决问题:

[ValueConversion(typeof(int), typeof(ImageSource))]
public class IdToImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value.GetType() != typeof(int) || targetType != typeof(ImageSource)) return false;
        int id = (int)value;
        if (id < 0) return DependencyProperty.UnsetValue;
        string imageName = string.Empty;
        switch (id)
        {
            case 1: imageName = "Item.1.png"; break;
            case 2: imageName = "Item.2.png"; break;
        }
        if (imageName.IsEmpty()) return null;
        return string.Format("/AppName;component/ImageFolderName/{0}", imageName);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return DependencyProperty.UnsetValue;
    }

然后您可以在ListBox.ItemTemplate这样的内容中使用它:

<YourConvertersXmlNamespacePrefix:IdToImageConverter x:Key="IdToImageConverter" />
...
<ListBox ItemsSource="{Binding Items}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Image Source="{Binding Id, Converter={StaticResource 
IdToImageConverter}}" />
                <TextBlock Text="{Binding Name}" Margin="5,0,0,0" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

答案 1 :(得分:3)

根据我的理解你的问题,列表框中的每个对象都有一个ID属性,您希望图像为item。 ID .png。

您可以在绑定中使用转换器来执行此操作。因此,在列表框模板中,您可以使用以下内容:

// ... Listbox template
<Image Source={Binding pathToItemID, Converter={StaticResource MyConverter}/>
// ... Remaining ListBox template

您需要将转换器添加到UserControl的资源中:

<UserControl.Resources>
    <xmlnsPointingToConverter:MyConverter x:Key="MyConverter"/>
</UserControl.Resources>

然后添加一个实现IValueConverter的MyConverter类:

public class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return string.Format("item.{0}.png", value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}