I am building an application that can be used by many users. Each user is classified to one of the next Authentication levels:
public enum AuthenticationEnum
{
User,
Technitian,
Administrator,
Developer
}
Some controls (such as buttons) are exposed only to certain levels of users. I have a property that holds the authentication level of the current user:
public AuthenticationEnum CurrentAuthenticationLevel { get; set; }
I want to bind this property to the 'Visibilty' property of some controls and pass a parameter to the Converter method, telling it what is the lowest authentication level that is able to see the control. For example:
<Button Visibility="{Binding Path=CurrentAuthenticationLevel, Converter={StaticResource AuthenticationToVisibility}, ConverterParameter="Administrator"}"/>
means that only 'Administrator' and 'Developer' can see the button. Unfortunately, the above code passes "Administrator" as a string. Of course I can user Switch-Case inside the converter method and convert the string to AuthenticationEnum. But this is ugly and prone to maintenance errors (each time the enum changes - the converter method should change).
Is there a better way to pass not trivial object as a parameter?
ArsenMkrt's answer is correct,
Another way of doing this is to use the x:Static syntax in the ConverterParameter
<Button ...
Visibility="{Binding Path=CurrentAuthenticationLevel,
Converter={StaticResource AuthenticationToVisibility},
ConverterParameter={x:Static local:AuthenticationEnum.Administrator}}"/>
And in the converter
public class AuthenticationToVisibility : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
AuthenticationEnum authenticationEnum = (AuthenticationEnum)parameter;
//...
}
}