#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>