2010-05-07 9 views
6

Desidero mostrare un'icona/immagine diversa in base a un valore enum. Per esempio, se ho avuto il seguente enum:Come visualizzare icone Enum diverse usando solo XAML?

public enum UploadStatus 
    { 
     Unknown = 0, 
     WaitingToUpload = 10, 
     Uploading = 20, 
     Uploaded = 30, 
     UploadFailed = 40 
    } 

mi piacerebbe scrivere XAML che sembra qualcosa di simile:

... 

<EnumImage Value="{Binding Path=CurrentStatus}"> 
    <EnumImageItem Value="Unknown"   Image="/images/unknown.png" /> 
    <EnumImageItem Value="WaitingToUpload" Image="/images/clock.png" /> 
    <EnumImageItem Value="Uploading"  Image="/images/upload.png" /> 
    <EnumImageItem Value="Uploaded"  Image="/images/tick.png" /> 
    <EnumImageItem Value="UploadFailed" Image="/images/error.png" /> 
</EnumImage> 

... 

ho trovato molti post che suggeriscono personalizzato IValueConverters, ma quelle soluzioni non si adattano al paradigma XAML.

Eventuali suggerimenti o suggerimenti?

+0

In che modo un valore convertito non "si adatta al paradigma XAML"? – AnthonyWJones

+0

Bene, credo che i percorsi dell'immagine debbano rimanere nello XAML, non nel codice C#. Nelle soluzioni IValueConverter, il convertitore è responsabile della mappatura del valore enum in un percorso immagine. Vedo più benefici nel mantenere tutto in XAML. –

+0

ValueConverter esiste esattamente per questo motivo. Era pensato per prendere un tipo di dati e convertirlo per la vista. – Stephan

risposta

15

Ecco un convertitore di valori che mantiene il "paradigma XAML" ovvero la relazione tra valori enum e immagini viene mantenuta in XAML.

[ContentProperty("Items")] 
public class EnumToObjectConverter : IValueConverter 
{ 
    public ResourceDictionary Items { get; set; } 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string key = Enum.GetName(value.GetType(), value); 
     return Items[key]; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException("This converter only works for one way binding"); 
    } 
} 

Si noti che questo è molto generico e mappa effettivamente i valori di qualsiasi tipo di enum su qualsiasi oggetto arbitrario. Questo è ciò che il suo utilizzo sembra in XAML: -

<Grid.Resources> 
    <local:EnumToObjectConverter x:Key="Icons"> 
    <ResourceDictionary> 
<BitmapImage x:Key="Unknown" UriSource="/images/unknown.png" /> 
     <BitmapImage x:Key="WaitingToUpload" UriSource="/images/clock.png" />   
     <BitmapImage x:Key="Uploading"  UriSource="/images/upload.png" />   
     <BitmapImage x:Key="Uploaded"  UriSource="/images/tick.png" />   
     <BitmapImage x:Key="UploadFailed" UriSource="/images/error.png" />   
    </ResourceDictionary> 
    </local:EnumToObjectConverter> 
</Grid.Resources> 

Questo convertitore può essere utilizzato durante il binding proprietà del tipo enum: -

<Image Source="{Binding Status, Converter={StaticResource Icons}}" /> 
+0

Grazie Anthony, gli darò un vortice! –

+1

Questa è una soluzione molto accurata – jspaey

0

tuo EnumImage può essere configurato usando Image con DataTrigger:

<Image Tag="{Binding Gender}" Width="48" Height="48"> 
     <Image.Style> 
     <Style TargetType="Image"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=Tag, RelativeSource={RelativeSource Self}}" Value="Male"> 
        <Setter Property="Source" Value="/Resources/Client_Male.png"/> 
       </DataTrigger > 
       <DataTrigger Binding="{Binding Path=Tag, RelativeSource={RelativeSource Self}}" Value="Female"> 
        <Setter Property="Source" Value="/Resources/Client_Female.png"/> 
       </DataTrigger > 
      </Style.Triggers> 
     </Style> 
     </Image.Style> 
    </Image> 

Fonte: Displaying an image based on value in XAML

Problemi correlati