2011-02-09 14 views
29

Buduję aplikację, z której może korzystać wielu użytkowników. Każdy użytkownik jest klasyfikowany do jednego z następnych poziomów uwierzytelniania:Używanie enum w ConverterParameter

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

Niektóre elementy sterujące (takie jak przyciski) są widoczne tylko dla niektórych poziomów użytkowników. Mam właściwość, która utrzymuje poziom uwierzytelniania bieżącego użytkownika:

public AuthenticationEnum CurrentAuthenticationLevel { get; set; } 

Chcę powiązać tę właściwość do właściwości „visibilty” niektórych kontroli i przekazać parametr do metody Converter, mówiąc to, co jest najniższy poziom uwierzytelnienia, który jest w stanie zobaczyć kontrolkę. Na przykład:

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

oznacza, że ​​tylko „Administrator” i „Twórca” można zobaczyć przycisk. Niestety, powyższy kod przekazuje "Administrator" jako ciąg znaków. Oczywiście mogę użyć Switch-Case w metodzie konwertera i przekonwertować ciąg na AuthenticationEnum. Jest to jednak brzydkie i podatne na błędy serwisowe (za każdym razem, gdy zmienia się enum - metoda konwertera powinna się zmienić).

Czy istnieje lepszy sposób przekazywania nie banalnego obiektu jako parametru?

+0

Nie musisz podawać parametru 'KonwerterParametru' jako ciągu znaków –

+3

Ustaw odpowiedź Fredrika jako odpowiedź Proszę. –

+0

Zobacz w przypadku innych formatów i więcej szczegółów - https://stackoverflow.com/questions/359699/passing-an-enue-as-command-parameter-from-xaml – akjoshi

Odpowiedz

4

użytkownika

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

do analizowania ciąg jako wyliczający

+2

Używanie wartości enum bezpośrednio ma lepszą wydajność niż parsowanie każdego razu? – linquize

65

odpowiedź ArsenMkrt jest poprawna,

Innym sposobem na osiągnięcie tego jest użycie x: Static składni w ConverterParameter

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

I w konwerterze

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

Jak możemy to zrobić w aplikacjach Windows Store? Wygląda na to, że x: Static nie jest rozpoznawalny dla tego typu projektu. –