2011-04-07 8 views
6

Traté de obligar a la siguiente enumeración a un cuadro combinadoEncuadernación convertida Enum a un cuadro combinado

Public Enum PossibleActions 
    ActionRead 
    ActionWrite 
    ActionVerify 
End Enum 

No puedo cambiar la propia enumeración, pero no desee mostrar estas cadenas. Mi intención es solo cortar el prefijo 'Acción' y mostrar 'Leer', 'Escribir' y 'Verificar' en el ComboBox. Por lo tanto escribí un ValueConverter

Public Class PossibleActionsConverter 
    Implements IValueConverter 

     Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert 
     Dim actions() As PossibleActions 
     Dim strings() As String 

     actions = CType(value, PossibleActions()) 
     ReDim strings(actions.GetUpperBound(0)) 
     For i = 0 To actions.GetUpperBound(0) 
      strings(i) = actions(i).ToString.Substring(6) 
     Next 
     Return strings 
     End Function 

     Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack 
     Dim s As String 

     s = CStr(value) 

     Return [Enum].Parse(GetType(PossibleActions), "Action" & s) 
     End Function 
    End Class 

Mi XAML parece

xmlns:sys="clr-namespace:System;assembly=mscorlib" 
xmlns:local="clr-namespace:StepEditor" 

[...]

<Window.Resources> 
    <ObjectDataProvider x:Key="possibleActionsEnum" MethodName="GetValues" 
         ObjectType="{x:Type sys:Enum}"> 
     <ObjectDataProvider.MethodParameters> 
      <x:TypeExtension Type="local:PossibleActions"></x:TypeExtension> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
    <local:PossibleActionsConverter x:Key="possibleActionsConverter"></local:PossibleActionsConverter> 
</Window.Resources> 

[...]
O bien:

<ComboBox ItemsSource="{Binding Source={StaticResource possibleActionsEnum}, Converter={StaticResource possibleActionsConverter}}" 
      SelectedItem="{Binding SelectedAction}"></ComboBox> 

O bien:

<ComboBox ItemsSource="{Binding Source={StaticResource possibleActionsEnum}, Converter={StaticResource possibleActionsConverter}}" 
      SelectedItem="{Binding SelectedAction, Converter={StaticResource possibleActionsConverter}}"></ComboBox> 

Mi problema es la vinculación del artículo seleccionado. No funciona, pero no puedo entender por qué.

Respuesta

3

La vinculación de SelectedItem es incorrecta, porque convierte su Enum en cadenas, pero SelectedItems es una cadena única. Si desea seguir con esta arquitectura, escriba un convertidor que convierta una sola cadena de nuevo en su enumeración. Los métodos Convert y ConvertBack de su convertidor existente están cerca de la solución. Pueden ser:

Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert 
    Dim action As PossibleActions 

    action = CType(value, PossibleActions) 
    Return action.ToString.Substring(6) 
    End Function 

    Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack 
    Dim s As String 

    s = CStr(value) 
    Return [Enum].Parse(GetType(PossibleActions), "Action" & s) 
    End Function 
1

La mejor solución a este problema en mi humilde opinión es el uso de una plantilla de datos, por lo que no tienen que aplicar 2 convertidores como en la respuesta anterior (uno que convierte una sola enumeración, y otro que convierte una matriz). Usando un datatemplete, el convertidor se puede aplicar a cada elemento del menú desplegable de forma individual, por lo que el convertidor que convierte un conjunto ya no es necesario.

<ComboBox.ItemTemplate> 
    <DataTemplate> 
    <TextBlock Text="{Binding Converter={StaticResource possibleActionConverter}}" /> 
    </DataTemplate> 
</ComboBox.ItemTemplate> 

con possibleActionConverter convertir una sola enumeración de cadena.

HTH

Cuestiones relacionadas