WPF использует привязку для назначения статического ресурса
Я пытаюсь использовать перечисление для отображения соответствующего изображения. Для этого у меня есть конвертер значений, который преобразует перечисление в правильное имя ресурса. Мои ресурсы определяются следующим образом:
<UserControl.Resources>
<BitmapImage x:Key="AlarmCat1" UriSource="/Lib.Infrastructure;component/Resources/msg_cat1.bmp" />
<BitmapImage x:Key="AlarmCat2" UriSource="/Lib.Infrastructure;component/Resources/msg_cat2.bmp" />
<BitmapImage x:Key="AlarmCat3" UriSource="/Lib.Infrastructure;component/Resources/msg_cat3.bmp" />
<converters:JamCategoryToImageConverter x:Key="AlarmCategoryConverter" />
</UserControl.Resources>
Это работает:
<Image Source="{StaticResource AlarmCat1}" />
Но это не так, конвертер вызывается и правильное значение возвращается. Каков правильный синтаксис?
<Image Source="{StaticResource { Binding CurrentAlarmItem.AlarmCategory, Converter={StaticResource AlarmCategoryConverter}}}" />
Для полноты, это функция преобразования:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
switch ((AlarmCategory)value)
{
case AlarmCategory.Category1:
return "AlarmCat1";
case AlarmCategory.Category2:
return "AlarmCat2";
case AlarmCategory.Category3:
return "AlarmCat3";
default:
return null;
}
}
Ответы
Ответ 1
Я бы вернул ресурс в конвертер:
<Image Source="{Binding CurrentAlarmItem.AlarmCategory, Converter={StaticResource AlarmCategoryConverter}}" />
В конвертере сделайте что-то вроде этого:
return Application.Current.FindResource("AlarmCat1") as BitmapImage;
Задайте свои ресурсы для всего приложения с помощью ресурса resource (app.xaml)
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Dictionary1.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
В вашем словаре (Dictionary1.xaml)
<BitmapImage x:Key="AlarmCat1" UriSource="bh.jpg" />
Поскольку ваши ресурсы теперь определены на уровне приложения, код теперь найдет ваш ресурс и вернет его.
Ответ 2
Вы не можете привязать ключ StaticResource
, поскольку это не DependancyProperty
. Либо вам придется привязать Source
непосредственно к перечислению с помощью converter
и обновить код конвертера, чтобы вернуть сам Bitmap
.
Второй вариант будет использоваться Triggers
для установки свойства Source
в зависимости от значения enum
.
<Image >
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding CurrentAlarmItem.AlarmCategory}"
Value="Category1">
<Setter Property="Source" Value="{StaticResource AlarmCat1}" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>