Адаптер типа привязки C # Wpf

#c# #.net #wpf #binding

#c# #.net #wpf #привязка

Вопрос:

На данный момент я назначаю изображение элемента 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», перечисление, содержащее несколько цветов, и привязать привязку источника изображения к этому значению, чтобы, если

Color = MarkerColor.green; привязка будет ссылаться на «/Ресурсы/green.png»

Обратите внимание, что имя PNG не обязательно совпадает с именем MarkerColor, для преобразования типа следует использовать «адаптер»

Я знаю, как это сделать в Java Android SDK, но не совсем уверен в том, как достичь этого в Wpf

Ответ №1:

Вы могли бы создать конвертер, который знает, как преобразовать значение перечисления в допустимый ресурс:

 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>