2011-02-09 13 views
29

Estoy creando una aplicación que puede ser utilizada por muchos usuarios. Cada usuario se clasifica a uno de los siguientes niveles de autenticación:Uso de enum en el parámetro Converter

public enum AuthenticationEnum 
{ 
    User, 
    Technitian,  
    Administrator, 
    Developer 
} 

Algunos controles (como botones) están expuestos sólo a ciertos niveles de usuarios. tengo una propiedad que tiene el nivel de autenticación del usuario actual:

public AuthenticationEnum CurrentAuthenticationLevel { get; set; } 

que desea enlazar esta propiedad a la propiedad 'visibilidad' de algunos controles y pasar un parámetro al método Converter, diciéndole que lo que es el nivel de autenticación más bajo que puede ver el control. Por ejemplo:

<Button Visibility="{Binding Path=CurrentAuthenticationLevel, Converter={StaticResource AuthenticationToVisibility}, ConverterParameter="Administrator"}"/> 

significa que sólo el 'Administrador' y 'desarrollador' pueden ver el botón. Desafortunadamente, el código anterior pasa "Administrador" como una cadena. Por supuesto, puedo usar Switch-Case dentro del método del convertidor y convertir la cadena en AuthenticationEnum. Pero esto es feo y propenso a errores de mantenimiento (cada vez que cambia la enumeración, el método del convertidor debería cambiar).

¿Hay una forma mejor de pasar un objeto no trivial como parámetro?

+0

no necesita pasar el 'ConverterParameter' como una cadena –

+3

Responda la respuesta de Fredrik por favor. –

+0

Consulte esto para conocer otros formatos y más detalles - https://stackoverflow.com/questions/359699/passing-an-enum-value-as-command-parameter-from-xaml – akjoshi

Respuesta

4

usuario

(AuthenticationEnum)Enum.Parse(typeof(AuthenticationEnum),parameter) 

a analizar la cadena como empadronador

+2

Usar el valor enum directamente tiene un mejor rendimiento que la cadena de análisis ¿cada vez? – linquize

65

respuesta de ArsenMkrt es correcta,

Otra forma de hacer esto es utilizar la x: sintaxis estática en el ConverterParameter

<Button ... 
     Visibility="{Binding Path=CurrentAuthenticationLevel, 
      Converter={StaticResource AuthenticationToVisibility}, 
      ConverterParameter={x:Static local:AuthenticationEnum.Administrator}}"/> 

Y en el convertidor

public class AuthenticationToVisibility : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     AuthenticationEnum authenticationEnum = (AuthenticationEnum)parameter; 
     //... 
    } 
} 
+3

¿Cómo podemos hacerlo en Windows Store Apps? Parece que x: Static no es reconocible por este tipo de proyecto. –