2

XAML内でこれを実行できるライブラリを確認しました。このライブラリは、ユーザーがロールに属しているかどうかに基づいてコントロールの可視性を設定します。s:Authorization.RequiresRole = "Admin"

そのライブラリをデータベースで使用するには、現在実際には実行できない一連のコーディングが必要です。最終的に私が知りたいことはここにあります...

SPROCから認証済みユーザーの役割を受け取り、現在App.xaml.csにプロパティとして保存されています(最終的なソリューションには必要ありません。現時点では参考までに)。他のライブラリにあるものと非常によく似たものを言うことができるプロパティ(依存関係プロパティ?添付プロパティ?)を作成したい:RequiresRole = "Admin"。これは、ユーザーが管理者ロールにない場合に表示を折りたたむ。誰かが私をこれについて正しい方向に向けることができますか?

編集 承認クラスを作成した後、次のエラーが発生します:「プロパティ'RequiredRole'は、XML名前空間clr-namespace:TSMVVM.Authorizationのタイプ'HyperlinkBut​​ton'に存在しません」

このxamlを追加しようとしています:

<HyperlinkButton x:Name="lnkSiteParameterDefinitions" 
        Style="{StaticResource LinkStyle}" 
                                  Tag="SiteParameterDefinitions" 
        Content="Site Parameter Definitions" 
        Command="{Binding NavigateCommand}"
        s:Authorization.RequiredRole="Admin"
        CommandParameter="{Binding Tag, ElementName=lnkSiteParameterDefinitions}"/>

s:Authorization.RequiredRole = "Admin"と入力し始めると、インテリセンスがそれを取得しました。typeof(string)とtypeof(ownerclass)をHyperlinkBut​​tonに設定して、それが役立つかどうかを確認しようとしましたが、うまくいきませんでした。何かご意見は?

4

1 に答える 1

4

添付プロパティは、それを実装する方法です。次のようにプロパティを定義する必要があります。

public class Authorization
{
    #region Attached DP registration

    public static string GetRequiredRole(UIElement obj)
    {
        return (string)obj.GetValue(RequiredRoleProperty);
    }

    public static void SetRequiredRole(UIElement obj, string value)
    {
        obj.SetValue(RequiredRoleProperty, value);
    }

    #endregion

    // Using a DependencyProperty as the backing store for RequiredRole.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty RequiredRoleProperty =
        DependencyProperty.RegisterAttached("RequiredRole", typeof(string), typeof(Authorization), new PropertyMetadata(RequiredRole_Callback));

    // This callback will be invoked when some control will receive a value for your 'RequiredRole' property
    private static void RequiredRole_Callback(DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        var uiElement = (UIElement) source;
        RecalculateControlVisibility(uiElement);

        // also this class should subscribe somehow to role changes and update all control's visibility after role being changed
    }

    private static void RecalculateControlVisibility(UIElement control)
    {
        //Authorization.UserHasRole() - is your code to check roles
        if (Authentication.UserHasRole(GetRequiredRole(control)))
            control.Visibility = Visibility.Visible;
        else 
            control.Visibility = Visibility.Collapsed;
    }
}

PS: あなたが Silverlight について質問していたことに気付くのが遅すぎました。そこでは同じように機能すると思いますが、WPFでのみ試しました。

于 2011-02-11T23:42:06.110 に答える