2011-02-09 4 views
29

Я создаю приложение, которое может использоваться многими пользователями. Каждый пользователь классифицируется к одному из следующих уровней аутентификации:Использование перечисления в ConverterParameter

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

Некоторые элементы управления (например, кнопки) подвергаются только для определенных категорий пользователей. У меня есть свойство, которое удерживает уровень аутентификации текущего пользователя:

public AuthenticationEnum CurrentAuthenticationLevel { get; set; } 

Я хочу, чтобы связать это свойство со свойством «Visibilty» некоторых элементов управления и передать параметр методе конвертера, говоря ему, что это самый низкий уровень аутентификации, который способен видеть элемент управления. Например:

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

означает, что только «Администратор» и «Разработчик» можно увидеть кнопку. К сожалению, приведенный выше код передает «Администратор» в виде строки. Конечно, я могу использовать Switch-Case внутри метода конвертера и преобразовать строку в AuthenticationEnum. Но это уродливо и подвержено ошибкам обслуживания (каждый раз, когда изменяется перечисление - метод конвертера должен меняться).

Есть ли лучший способ передать не тривиальный объект в качестве параметра?

+0

Вам не нужно передавать 'ConverterParameter' в виде строки –

+3

Ответьте на вопрос Fredrik как ответ. –

+0

См. Это для других форматов и более подробной информации - https://stackoverflow.com/questions/359699/passing-an-enum-value-as-command-parameter-from-xaml – akjoshi

ответ

4

Пользователь

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

разобрать строку как перечислителем

+2

Использование значения enum напрямую имеет лучшую производительность, чем строка синтаксического анализа каждый раз? – linquize

65

ответ ArsenMkrt является правильным,

Другой способ сделать это состоит в использовании х: статический синтаксис в ConverterParameter

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

И в преобразователе

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

Как это сделать в Windows Store Apps? Кажется, что x: Static не распознается этим типом проекта. –

Смежные вопросы