2013-08-20 2 views
0

У меня есть несколько изображений, определенных в мой ресурс разделе моего пользовательского интерфейса:Как ссылаться на изображение ресурса в конверторе?

<Window.Resources> 
    <!-- Converters --> 
    <loc:UserStatusToIconConverter x:Key="UserStatusToIconConverter" /> 

    <!-- Images --> 
    <BitmapImage x:Key="ConnectIcon" UriSource="/WPFClient;component/Images/connect.png" /> 
    <BitmapImage x:Key="ActiveIcon" UriSource="/WPFClient;component/Images/active.png" /> 
    <BitmapImage x:Key="IdleIcon" UriSource="/WPFClient;component/Images/idle.png" /> 
    <BitmapImage x:Key="AwayIcon" UriSource="/WPFClient;component/Images/away.png" /> 
    <BitmapImage x:Key="UnknownIcon" UriSource="/WPFClient;component/Images/unknown.png" /> 
... 

Я хотел бы, чтобы выбрать один из них для привязки в моем преобразователе, я полагаю, это было бы более эффективным, чем создание нового образа каждый раз (500 раз) от преобразователя.

public class UserStatusToIconConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     string userStatus = value.ToString(); 
     string iconName = ...; 

     switch (userStatus) 
     { 
      case "Active": 
       // select ActiveIcon; 
       break; 
      case "Idle": 
       // select IdleIcon; 
       break; 
      case "Away": 
       ... 
       break; 
     } 

     return iconName; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Вот где я использую его:

  <ListBox ItemsSource="{Binding Users}"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <DockPanel> 
          <Image Source="{Binding Status, Converter={StaticResource UserStatusToIconConverter}}" Height="16" Width="16" /> 
          <TextBlock Text="{Binding Nick}" /> 
         </DockPanel> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
+0

Почему новый вопрос? – Clemens

ответ

2

Я думаю, что вы лучше использовать DataTemplate.Triggers в этом а не конвертер:

    <DataTemplate> 
        <DockPanel> 
         <Image x:Name="Img" Height="16" Width="16" /> 
         <TextBlock Text="{Binding Nick}" /> 
        </DockPanel> 

        <DataTemplate.Triggers> 
         <DataTrigger Binding="{Binding Status}" Value="Active"> 
          <Setter TargetName="Img" Property="Source" Value="{StaticResource ActiveIcon}"/> 
         </DataTrigger> 

         <DataTrigger Binding="{Binding Status}" Value="Idle"> 
          <Setter TargetName="Img" Property="Source" Value="{StaticResource IdleIcon}"/> 
         </DataTrigger> 

         <!-- And So on... --> 

        </DataTemplate.Triggers> 
       </DataTemplate> 
0

Вы можете просто сделать следующее в вашем методе Convert:

return Application.Current.MainWindow.FindResource(iconName); 
+1

Хотя лично я бы предпочел использовать DataTriggers, как было предложено в другом ответе. – Clemens

Смежные вопросы