Использование enum в ConverterParameter - PullRequest
35 голосов
/ 09 февраля 2011

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

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

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

public AuthenticationEnum CurrentAuthenticationLevel { get; set; }

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

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

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

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

Ответы [ 2 ]

79 голосов
/ 09 февраля 2011

ArsenMkrt ответ правильный,

Еще один способ сделать это - использовать синтаксис x: Static в 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;
        //...
    }
}
6 голосов
/ 09 февраля 2011

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

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

для анализа строки в качестве перечислителя

...