I am trying to use an enum to display a corresponding image. For this I have a value converter that converts an enum to the correct resource name. My resources are defined as follows:
<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>
This works:
<Image Source="{StaticResource AlarmCat1}" />
But this doesn't, the converter is called and the correct value is passed back. What is the correct syntax?
<Image Source="{StaticResource { Binding CurrentAlarmItem.AlarmCategory, Converter={StaticResource AlarmCategoryConverter}}}" />
For completeness, this is the convert function:
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;
}
}
I would return the resource in the converter:
<Image Source="{Binding CurrentAlarmItem.AlarmCategory, Converter={StaticResource AlarmCategoryConverter}}" />
In your converter do something like this:
return Application.Current.FindResource("AlarmCat1") as BitmapImage;
Set your resources for the complete application with the use of resourcedictionary (app.xaml)
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Dictionary1.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
In your Dictionary (Dictionary1.xaml)
<BitmapImage x:Key="AlarmCat1" UriSource="bh.jpg" />
Because your resources are now defined on applicationlevel, the code will now find your resource and give it back.
You cannot bind the StaticResource
Key as it is not the DependancyProperty
. Either you will have to Bind Source
directly to the enum using converter
and update the converter code to return the Bitmap
itself.
Second option will be to used Triggers
to set the Source
property depending on the enum
value.
<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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With