10

ロール ベースのセキュリティに .NET の IIdentity および IPrincipal オブジェクトを使用しています。現在、現在のユーザーが持っているロールに基づいて表示されるコントロールを変更しています。

私の質問は、WPF ウィンドウでフィールドを有効/無効にするための推奨される方法は何ですか - IIdentity.IsInRole タイプの呼び出しに依存するフィールドを表示/非表示にします。

これを XAML で行うことはできますか、それともコード ビハインドが少し面倒だと思うコードに抽象化する必要がありますか。

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

(注: 私のコードは、関数を実行するときにロールをチェックします。私がしようとしているのは、ロールに応じて GUI を変更することです。そのため、ユーザーはアクセス権のない読み取り専用要素を表示/表示しません)

4

2 に答える 2

20

前の答えはうまくいきますが、論理オブジェクトの可視性を検出するのは少し見苦しく見えます。そのためにコンバーターを使用します...

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

そして、コンバーター自体

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();
    }
}
于 2009-06-19T22:24:09.097 に答える
1
<Control Visibility={Binding ElementName=ThisWindow, Path=AdministratorVisibility, Mode=OneWay}/>

C# コードで:

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

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

これはおそらく、あなたがすでに行っていることよりもはるかに優れているわけではありませんが、おそらくあなたが得ようとしているものと同じくらい優れています.

于 2009-06-19T18:06:08.707 に答える