我有一个从数据表中填充的列表框。我希望每个项目在列表框上都有一个特定的图像,但我想根据每个项目的ID设置图像。 例如,我有:
产品
橙色
Apple
ID
1
2
并将图片命名为: Item.1.png , Item.2.png
所以,在我的列表框中,我有苹果,我会在其旁边找到名为:Item.2.png的图片。
我的问题是我不知道如何进行条件绑定。我不希望在我的模板上有数百行为每个项目执行此操作。我需要使用条件来执行此操作,例如:if(product.id == 1),Image.Source = Item.1.png。 在wpf中有没有办法做到这一点?
答案 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();
}
}