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>