2010-03-28 11 views
7

Tengo una enumeración digamosCómo declarar combobox itemTemplate que tiene Itemsource como Enum Values ​​en WPF?

enum MyEnum 
{ 
    FirstImage, 
    SecondImage, 
    ThirdImage, 
    FourthImage 
}; 

he binded esta enumeración a mi cuadro combinado en XAML.

Si bien la definición de un cuadro combinado que he definido un ItemTemplate de combox tomar dos elementos de interfaz de usuario:

  1. TextBlock que muestran el valor de enumeración (Descripción)
  2. imagen

he hecho esto mucho en XAML.

Me pregunto dónde puedo especificar la corrosión de la imagen para cada elemento de valor de Enum en un cuadro combinado. ¿Es eso posible a través del disparo de datos?

Realmente aprecio que alguien tenga el XAML para este escenario.

Muchas gracias de antemano

Respuesta

13

Se puede utilizar un DataTrigger, pero sería más fácil de mantener si se ha utilizado un convertidor. Aquí hay una muestra que usa un DataTrigger para una vista de la imagen y el texto, y luego el mismo DataTrigger para mostrar la imagen y el texto en ListBox y ComboBox, y finalmente, un ListBox y ComboBox que usan un convertidor para mostrar la imagen y texto:

XAML

<Window x:Class="WpfSandbox.EnumToImage.EnumToImage" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:System="clr-namespace:System;assembly=mscorlib" 
     xmlns:local="clr-namespace:WpfSandbox.EnumToImage" 
     Title="Enum To Image" SizeToContent="WidthAndHeight" > 

    <Window.DataContext> 
     <local:ImageViewModel x:Name="Model" /> 
    </Window.DataContext> 

    <Window.Resources> 

     <ObjectDataProvider x:Key="EnumDataProvider" 
          MethodName="GetValues" 
          ObjectType="{x:Type System:Enum}"> 
      <ObjectDataProvider.MethodParameters> 
       <x:Type TypeName="local:Decade"/> 
      </ObjectDataProvider.MethodParameters> 
     </ObjectDataProvider> 

     <local:DecadeEnumImageConverter x:Key="ImageConverter" /> 


     <ControlTemplate x:Key="ImageTemplate" > 

      <StackPanel Orientation="Horizontal"> 
       <Image x:Name="MyImage" Width="64" Height="32" /> 
       <TextBlock Text="{Binding}" VerticalAlignment="Center" /> 
      </StackPanel> 


      <ControlTemplate.Triggers> 
       <DataTrigger Binding="{Binding}" Value="Ninties" > 
        <DataTrigger.Setters> 
         <Setter TargetName="MyImage" 
           Property="Source" 
           Value="/EnumToImage/images/90s.jpg"/> 
        </DataTrigger.Setters> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding}" Value="Eighties" > 
        <DataTrigger.Setters> 
         <Setter TargetName="MyImage" 
           Property="Source" 
           Value="/EnumToImage/images/80s.jpg"/> 
        </DataTrigger.Setters> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding}" Value="Seventies" > 
        <DataTrigger.Setters> 
         <Setter TargetName="MyImage" 
           Property="Source" 
           Value="/EnumToImage/images/70s.jpg"/> 
        </DataTrigger.Setters> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding}" Value="Sixties" > 
        <DataTrigger.Setters> 
         <Setter TargetName="MyImage" 
           Property="Source" 
           Value="/EnumToImage/images/60s.jpg"/> 
        </DataTrigger.Setters> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding}" Value="Fifties" > 
        <DataTrigger.Setters> 
         <Setter TargetName="MyImage" 
           Property="Source" 
           Value="/EnumToImage/images/50s.jpg"/> 
        </DataTrigger.Setters> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding}" Value="Forties" > 
        <DataTrigger.Setters> 
         <Setter TargetName="MyImage" 
           Property="Source" 
           Value="/EnumToImage/images/40s.jpg"/> 
        </DataTrigger.Setters> 
       </DataTrigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 

     <DataTemplate x:Key="ItemsTemplateWithConverter"> 
      <StackPanel Orientation="Horizontal"> 
       <Image Width="64" Height="32" 
         Source="{Binding Converter={StaticResource ImageConverter}}"/> 
       <TextBlock Text="{Binding}" VerticalAlignment="Center" /> 
      </StackPanel> 
     </DataTemplate> 

     <DataTemplate x:Key="ItemsTemplateWithDataTrigger"> 
      <ContentControl Template="{StaticResource ImageTemplate}" /> 
     </DataTemplate> 

    </Window.Resources> 


    <StackPanel> 
     <ContentControl Margin="10" MouseUp="OnImageMouseUp" 
         HorizontalAlignment="Center" Cursor="Hand" 
         DataContext="{Binding Path=ImageEnum}" 
         Template="{StaticResource ImageTemplate}" /> 

     <StackPanel Orientation="Horizontal"> 

      <StackPanel> 
       <ListView Margin="10" 
        ItemsSource="{Binding Source={StaticResource EnumDataProvider}}" 
        ItemTemplate="{StaticResource ItemsTemplateWithConverter}" /> 

       <ComboBox Margin="10" 
        ItemsSource="{Binding Source={StaticResource EnumDataProvider}}" 
        ItemTemplate="{StaticResource ItemsTemplateWithConverter}" /> 
      </StackPanel> 

      <StackPanel> 
       <ListView Margin="10" 
        ItemsSource="{Binding Source={StaticResource EnumDataProvider}}" 
        ItemTemplate="{StaticResource ItemsTemplateWithDataTrigger}" /> 

       <ComboBox Margin="10" 
        ItemsSource="{Binding Source={StaticResource EnumDataProvider}}" 
        ItemTemplate="{StaticResource ItemsTemplateWithDataTrigger}" /> 
      </StackPanel> 

     </StackPanel> 
    </StackPanel> 

</Window> 

Código Detrás

using System; 
using System.ComponentModel; 
using System.Globalization; 
using System.Windows; 
using System.Windows.Input; 
using System.Windows.Data; 

namespace WpfSandbox.EnumToImage 
{ 
    /// <summary> 
    /// Interaction logic for EnumToImage.xaml 
    /// </summary> 
    public partial class EnumToImage : Window 
    { 
     public EnumToImage() 
     { 
      InitializeComponent(); 
     } 

     private int i = 1; 
     private void OnImageMouseUp(object sender, MouseButtonEventArgs e) 
     { 
      i++; 
      Model.ImageEnum = (Decade)i; 

      if(i == 6) 
       i = 0; 
     } 
    } 

    public enum Decade 
    { 
     Ninties = 1, 
     Eighties = 2, 
     Seventies = 3, 
     Sixties = 4, 
     Fifties = 5, 
     Forties = 6, 
    }; 

    public class ImageViewModel : INotifyPropertyChanged 
    { 
     private Decade _imageEnum; 
     public Decade ImageEnum 
     { 
      get { return _imageEnum; } 
      set 
      { 
       _imageEnum = value; 
       RaisePropertyChanged("ImageEnum"); 
      } 
     } 

     public ImageViewModel() 
     { 
      ImageEnum = Decade.Ninties; 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected void RaisePropertyChanged(string propertyName) 
     { 
      var handler = PropertyChanged; 
      if(handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

    } 

    public class DecadeEnumImageConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 

      var myEnum = (Decade)Enum.Parse(typeof(Decade), value.ToString()); 

      switch(myEnum) 
      { 
       case Decade.Ninties: 
        return "/EnumToImage/images/90s.jpg"; 
       case Decade.Eighties: 
        return "/EnumToImage/images/80s.jpg"; 
       case Decade.Seventies: 
        return "/EnumToImage/images/70s.jpg"; 
       case Decade.Sixties: 
        return "/EnumToImage/images/60s.jpg"; 
       case Decade.Fifties: 
        return "/EnumToImage/images/50s.jpg"; 
       case Decade.Forties: 
        return "/EnumToImage/images/40s.jpg"; 
       default: 
        throw new ArgumentOutOfRangeException(); 
      } 
     } 

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

Muchas muchas gracias por la solución para ambos utilizando convertidores y disparadores de datos. Estoy de acuerdo con usted en que el uso del convertidor será más fácil de mantener. –

Cuestiones relacionadas