2010-05-07 18 views
6

Tôi muốn hiển thị một biểu tượng/hình ảnh khác nhau tùy thuộc vào giá trị enum. Ví dụ, nếu tôi đã có enum sau:Làm cách nào để hiển thị các biểu tượng Enum khác nhau bằng cách sử dụng XAML?

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

Tôi muốn viết XAML mà trông giống như sau:

... 

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

... 

tôi đã tìm thấy nhiều bài viết cho thấy IValueConverters tùy chỉnh, nhưng những giải pháp đó không phù hợp với mô hình XAML.

Bất kỳ gợi ý hay đề xuất nào?

+0

Giá trị nào chuyển đổi không "phù hợp với mô hình XAML" theo cách nào? – AnthonyWJones

+0

Vâng, tôi tin rằng các đường dẫn hình ảnh sẽ vẫn còn trong XAML, không phải trong mã C#. Trong các giải pháp IValueConverter tôi có vẻ, bộ chuyển đổi chịu trách nhiệm lập bản đồ giá trị enum cho một đường dẫn hình ảnh. Tôi thấy nhiều lợi ích hơn trong việc giữ nó trong XAML. –

+0

ValueConverter tồn tại vì lý do chính xác này. Nó có nghĩa là để có một kiểu dữ liệu và chuyển đổi cho xem. – Stephan

Trả lời

15

Đây là bộ chuyển đổi giá trị duy trì mô hình XAML "" là mối quan hệ giữa các giá trị enum và hình ảnh được duy trì trong 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"); 
    } 
} 

Lưu ý rằng điều này rất chung chung, nó thực sự ánh xạ các giá trị của bất kỳ loại enum nào cho bất kỳ đối tượng arbitary nào. Đây là những gì sử dụng của nó trông giống như trong 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> 

chuyển đổi này có thể được sử dụng khi ràng buộc tài sản của kiểu enum: -

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

Cảm ơn Anthony, tôi sẽ cho nó một vòng xoáy! –

+1

Đây là một giải pháp rất gọn gàng – jspaey

0

bạn EnumImage có thể được thiết lập sử dụng Image với 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> 

Nguồn: Displaying an image based on value in XAML

Các vấn đề liên quan