WPF使用绑定来分配静态资源

时间:2013-11-29 06:00:42

标签: c# 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;
    }
}

2 个答案:

答案 0 :(得分:21)

我会在转换器中返回资源:

<Image Source="{Binding CurrentAlarmItem.AlarmCategory, Converter={StaticResource AlarmCategoryConverter}}" />

在您的转换器中执行以下操作:

return Application.Current.FindResource("AlarmCat1") as BitmapImage;

使用resourcedictionary(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" />

由于您的资源现在已在applicationlevel上定义,因此代码现在可以找到您的资源并将其还原。

答案 1 :(得分:5)

您无法绑定StaticResource密钥,因为它不是DependancyProperty。您必须使用Sourceconverter直接绑定到枚举,并更新转换器代码以返回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>