2010-05-07 32 views
6

我想根據枚舉值顯示不同的圖標/圖像。舉例來說,如果我有以下枚舉:如何僅使用XAML顯示不同的枚舉圖標?

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

我想寫XAML看起來是這樣的:

... 

<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> 

... 

我發現很多帖子提示定製IValueConverters,但這些解決方案不適合XAML範例。

任何指針或建議?

+0

值轉換不符合「XAML範式」的方式? – AnthonyWJones 2010-05-07 11:20:34

+0

嗯,我相信圖像路徑應該保留在XAML中,而不是C#代碼中。在我看來的IValueConverter解決方案中,轉換器負責將枚舉值映射到圖像路徑。我發現將所有這些保留在XAML中會帶來更多好處。 – 2010-05-07 11:41:04

+0

正是出於這個原因,ValueConverter才存在。這是爲了獲取數據類型並轉換爲視圖。 – Stephan 2010-05-07 14:12:26

回答

15

這裏是一個值轉換器,它維護在XAML中維護枚舉值和圖像之間關係的「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"); 
    } 
} 

注意,這是很普通的,它實際上映射任何枚舉類型的值,以任何arbitary對象。這就是它的使用看起來像在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> 

該轉換器可結合枚舉類型的屬性時,可以使用: -

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

謝謝安東尼,我會給它一個旋風! – 2010-05-07 15:25:13

+1

這是一個非常整潔的解決方案 – jspaey 2012-10-17 15:14:39

0

EnumImage可以使用ImageDataTrigger進行設置:

<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> 

來源:Displaying an image based on value in XAML