2009-06-19 11 views
8

Używam obiektów IIdentity i IPrincipal .NET dla bezpieczeństwa opartego na rolach i jestem na etapie modyfikacji kontroli pokazanych na podstawie ról, jakie ma bieżący użytkownik.Jak manipulować GUI WPF na podstawie ról użytkownika

Moje pytanie brzmi, jak zalecana jest metoda włączania/wyłączania pól w oknie WPF - pokazywanie/ukrywanie pól zależnych od wywołania typu IIdentity.IsInRole.

Czy można to zrobić w XAML, czy też muszę to rozwinąć w kod z tym, co moim zdaniem jest trochę nieporządne w kodzie;

this.txtUserName.IsReadOnly = !MyPrincipal.CurrentPrincipal.IsInRole("Administrator"); 
this.mnuCreateUser.Visibility = MyPrincipal.CurrentPrincipal.IsInRole("Administrator"); 
? Visibility.Hidden : Visibility.Visible; 

(Uwaga; moje kod sprawdza ról podczas wykonywania funkcji, czego szukam zrobić to modyfikując GUI zależy od roli, więc użytkownicy nie widzą/zobaczyć elementy tylko do odczytu, które nie mają dostępu do)

Odpowiedz

15

Chociaż poprzednia odpowiedź będzie działać, dla mnie wygląda trochę brzydko, aby wykryć widoczność w obiektach logicznych. Chciałbym skorzystać z konwertera do tego ...

<Control Visibility={Binding Path=CurrentPrincipal, Converter={StaticResource RoleToVisibilityConverter}, ConverterParameter=Administrator}/> 

a następnie sama przetwornica

public class RoleToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var principal = value as Principal; 
     if(principal != null) { 
      return principal.IsInRole((string)parameter) ? Visibility.Visible : Visibility.Collapsed; 
     } 

     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Ahh, to bardzo mi odpowiada. Dzięki temu w XAML powinno być proste, aby zobaczyć dostęp, który jest wymagany, aby zobaczyć różne elementy w GUI. Dziękuję Ci. – Thies

+0

Serdecznie zapraszamy –

+0

Swipers innych wskaźników kodu, może być konieczne dodanie "return" przed "new NotImplementedException();" – SteveCav

1
<Control Visibility={Binding ElementName=ThisWindow, Path=AdministratorVisibility, Mode=OneWay}/> 

W swojej kod C#:

public Visibility AdministratorVisibility 
{ 
    get 
    { 
     MyPrincipal.CurrentPrincipal.IsInRole("Administrator") ? Visibility.Hidden : Visibility.Visible; 
    } 
} 

można zrobić to samo dla wdrażania coś dla IsReadOnly. Jeśli rola użytkownika może się zmienić (nie jestem pewien, jak te role użytkownika działają), można wdrożyć INotifyPropertyChanged i wykonać NotifyPropertyChanged("AdministratorVisibility"), w przeciwnym razie prawdopodobnie można zmienić BindingMode na BindingMode.OneTime i pominąć implementację powiadomień.

To prawdopodobnie nie jest dużo lepsze niż to, co już robisz, ale prawdopodobnie jest tak dobre, jak masz zamiar dostać.

+0

Dzięki za odpowiedź. Role, których używam, aktualizują się tylko podczas zamykania i ponownego otwierania aplikacji, więc funkcja NotifyPropertyChange nie jest krytyczna. Myślałem o tej metodzie, ale miałem nadzieję, że istnieje coś bardziej bezpośredniego - podobnie jak składnia atrybutu roli, którą można stosować na metodach. – Thies

Powiązane problemy