C#Wpf绑定类型适配器

C#Wpf绑定类型适配器,c#,.net,wpf,binding,C#,.net,Wpf,Binding,现在,我使用直接绑定将TreeView项目的图像分配给图像的源: <DataTemplate DataType="{x:Type local:GeoPoint}"> <StackPanel Orientation="Horizontal"> <Image Source="{Binding Color}" Height="32" /> <TextBlock Text="{Binding Name}" Ver

现在,我使用直接绑定将TreeView项目的图像分配给图像的源:

<DataTemplate DataType="{x:Type local:GeoPoint}">
     <StackPanel Orientation="Horizontal">
          <Image Source="{Binding Color}" Height="32" />
          <TextBlock Text="{Binding Name}" VerticalAlignment="Center"/>
     </StackPanel>
</DataTemplate>

颜色绑定指的是包含PNG路径的字符串,类似于“/Resources/red.PNG”

我想让自定义类型的颜色变量“MarkerColor”,一个包含多种颜色的枚举,并让图像源绑定引用这个值,以便

颜色=MarkerColor.green;绑定将引用“/Resources/green.png”

请注意,PNG的名称不一定与MarkerColor的名称相同,应使用“适配器”转换类型


我知道如何在Java Android SDK中实现这一点,但不确定如何在Wpf中实现这一点。您可以创建一个转换器,它知道如何将枚举值转换为有效资源:

public class ColorResourceConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        MarkerColor color = (MarkerColor)value;
        Uri uri;
        switch(color)
        {
            case MarkerColor.Green:
                uri = new Uri("Resources/green.png");
                break;
            case MarkerColor.Red:
                uri = new Uri("Resources/red.png");
                break;
            //...
            default:
                uri = new Uri("Resources/default.png");
                break;
        }

        return new BitmapImage(uri);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}
用法:

<DataTemplate DataType="{x:Type local:GeoPoint}">
    <DataTemplate.Resources>
        <local:ColorResourceConverter x:Key="ColorResourceConverter" />
    </DataTemplate.Resources>
    <StackPanel Orientation="Horizontal">
        <Image Source="{Binding Color, Converter={StaticResource ColorResourceConverter}}" Height="32" />
        <TextBlock Text="{Binding Name}" VerticalAlignment="Center"/>
    </StackPanel>
</DataTemplate>