2

사용자가 역할에 있는지 여부에 따라 컨트롤의 가시성을 설정하는 내 XAML 내에서이 작업을 수행 할 수있는 라이브러리를 보았습니다. : Authorization.RequiresRole = "Admin "사용자 지정 XAML 속성

내 데이터베이스와 함께 해당 라이브러리를 사용하려면 지금 실제로 할 수없는 많은 코딩이 필요합니다. 궁극적으로 여기 내가 알고 싶은 것입니다 ...

SPROC에서 인증 된 사용자 역할을 받았으며 현재 내 App.xaml.cs에 속성으로 저장되어 있습니다 (최종 솔루션에는 필요하지 않음, 지금). 다른 라이브러리의 내용과 매우 비슷한 것을 말할 수있는 속성 (종속성 속성? 연결된 속성?)을 만들고 싶습니다. RequiresRole = "Admin". 사용자가 Admin 역할이 아닌 경우 가시성을 축소합니다. 아무도 이것에 올바른 방향으로 나를 가리킬 수 있습니까?

편집 인증 클래스를 구축 한 후, 나는 다음과 같은 오류 얻을 : "속성 'RequiredRole'는 XML 네임 스페이스 CLR 네임 스페이스의 유형 'HyperlinkButton'에 존재하지 않습니다 TSMVVM.Authorization를"

을 나는의 입력을 시작했을 때

<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}"/> 

: Authorization.RequiredRole = "관리자"를 인텔리 그것을 집어

나는이 XAML을 추가하는 것을 시도하고있다. 나는 그것이 도움이 될지보기 위해 typeof (string)과 typeof (ownerclass)를 HyperlinkButton에 설정하려고 시도했지만 그렇지 않았다. 이견있는 사람?

답변

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에서만 그것을 시도했습니다 믿습니다.

+0

응답 해 주셔서 감사합니다. 이 멋진데, 구현에 대해 몇 가지 질문이 있습니다. 1) typeof (ownerclass) -이 권한을 설정하지만이게 맞는지 확실하지 않습니다. 2) 새로운 UIPropertyMetadata ... 이것은 새로운 PropertyMetadata와 동일합니까? UIPropertyMetadata가 나를 위해 해결되지 않습니다. 3) UserHasRole 메서드를 만들었고 App.Role.ToLower()가 전달 된 role.ToLower()와 동일한 경우 true를 반환했습니다. 맞지? 4) 건물을 만들 때 오류가있어서 OP에 수정 사항이 추가되었습니다. –

+0

@Scott ownerClass - 1) 승인. 답변에 수정했습니다. 2) 예, Silverlight에 UIPropertyMetadata를 사용할 수 없으므로 PropertyMetadata를 사용하는 것이 좋습니다. 3) 예 – Snowbear

+0

원래 게시글에 추가 한 오류가 발생하는 이유는 무엇입니까? –