2009-06-19 6 views
8

ロールベースのセキュリティに.NETのIIdentityオブジェクトとIPrincipalオブジェクトを使用していますが、現在のユーザーの役割に基づいて表示されているコントロールを変更する段階にあります。ユーザーロールに基づいてWPF GUIを操作する方法

私の質問は、IIdentity.IsInRoleタイプの呼び出しに応じてフィールドを表示/非表示にするWPFウィンドウのフィールドを有効/無効にするための推奨方法です。

これはXAMLで行うことができますか、これをコードに抽象化する必要がありますか?

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

(注意;私のコードのチェックの役割を機能を実行するとき、私は何を探していますが役割に依存してGUIを変更され、ユーザーが表示されていないので、/彼らはへのアクセス権を持っていないことを読み取り専用の要素を参照してください)あなたのC#コードで

答えて

15

以前の回答は機能しますが、論理オブジェクトの可視性を検出するのは少し醜いようです。私は...そのため

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

をコンバータを使用して応答をA変換器自体

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

ああ、これは私の好みに非常に似ています。これをXAMLで実行すると、GUIのさまざまな要素を表示するために必要なアクセス権がわかります。ありがとうございました。 – Thies

+0

あなたは歓迎です –

+0

仲間のコードスワイパー、 "新しい" NotImplementedException();の前に "戻る"を追加する必要があります – SteveCav

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

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

あなたはIsReadOnlyのために何かを実装するために同じことを行うことができます。ユーザーの役割が変更される可能性がある場合は、INotifyPropertyChangedを実装してNotifyPropertyChanged("AdministratorVisibility")を実行してください。BindingModeBindingMode.OneTimeに変更し、通知の実装をスキップすることができます。

これはおそらく、あなたがすでにやっているものよりずっと良いことではありませんが、おそらくあなたが得るほど良いでしょう。

+0

おかげでしょう。私が使用している役割は、アプリケーションを終了して再度開くときにのみ更新されるため、NotifyPropertyChangeは重要ではありません。私はこの方法について考えましたが、より直接的なものが存在することを期待していました。つまり、メソッドで使用できる役割属性構文のようなものでした。 – Thies

関連する問題