2009-06-19 29 views
8

Tôi đang sử dụng các đối tượng IIdentity và IPrincipal của .NET để bảo mật dựa trên vai trò và tôi đang ở bước sửa đổi các điều khiển được hiển thị dựa trên vai trò của người dùng hiện tại.Cách thao tác WPF GUI dựa trên vai trò người dùng

Câu hỏi của tôi là phương pháp được đề xuất là cho phép/vô hiệu hóa các trường trong cửa sổ WPF - hiển thị/ẩn các trường phụ thuộc vào các cuộc gọi loại IIdentity.IsInRole.

Điều này có thể được thực hiện trong XAML hay tôi phải trừu tượng hóa điều này thành mã với những gì tôi cho là hơi lộn xộn trong mã phía sau;

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

(Lưu ý; vai trò kiểm tra mã của tôi khi thực hiện chức năng, những gì tôi đang tìm cách để làm được sửa đổi giao diện phụ thuộc vào vai trò, vì vậy người dùng không thấy/thấy yếu tố readonly rằng họ không có quyền truy cập vào)

Trả lời

15

Mặc dù câu trả lời trước đó sẽ hoạt động, đối với tôi có vẻ rất xấu xí để phát hiện khả năng hiển thị trong đối tượng logic. Tôi sẽ sử dụng chuyển đổi cho điều đó ...

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

Và sau đó chuyển đổi bản thân

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, điều này là rất nhiều theo ý thích của tôi. Với điều này trong XAML, nó phải thẳng về phía trước để xem truy cập được yêu cầu để xem các phần tử khác nhau trong GUI. Cảm ơn bạn. – Thies

+0

Bạn được chào đón –

+0

swipers mã đồng, bạn có thể cần thêm "return" trước "new NotImplementedException();" – SteveCav

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

Trong mã # C:

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

bạn có thể làm điều tương tự để thực hiện một cái gì đó cho IsReadOnly. Nếu vai trò của người dùng có thể thay đổi (tôi không chắc chắn vai trò của người dùng này hoạt động như thế nào), bạn có thể triển khai INotifyPropertyChanged và làm NotifyPropertyChanged("AdministratorVisibility"), nếu không, bạn có thể thay đổi BindingMode thành BindingMode.OneTime và bỏ qua triển khai thông báo.

Điều này có thể không tốt hơn rất nhiều so với những gì bạn đang làm, nhưng nó có thể tốt như bạn sắp có.

+0

Cảm ơn bạn đã trả lời. Các vai trò tôi đang sử dụng chỉ cập nhật khi đóng và mở lại ứng dụng, vì vậy NotifyPropertyChange không quan trọng. Tôi đã nghĩ về phương pháp này, nhưng đã hy vọng rằng một cái gì đó trực tiếp tồn tại - sorta giống như cú pháp thuộc tính role mà người ta có thể sử dụng trên các phương thức. – Thies

Các vấn đề liên quan