1

Silverlight Web アプリケーションでホストされている Silverlight Web アプリケーション (RIA) に取り組んでいます。

背景: xaml ページの 1 つにスタックパネルがあります。私は自分の問題を単純化しようとしました。以下のようにダウンしています。

私のxamlページにはスタックパネルがあり、そのスタックパネルにはテキストブロックとボタンしかありません。xaml ページに移動すると、承認されたユーザーのみがテキストブロックの値を確認できます。ユーザーが許可されていない場合、テキストブロックに「許可されていない」というメッセージ (値の代わりに) を表示する予定です (ボタンも折りたたまれています。ボタンは表示しません)。

参考までに、この texblock の値は WCF サービスからのものであり、サービスでの承認のために適切な属性を作成しました。許可されていない場合、サービスからテキストブロックに価値はもたらされません。私が今行っているのは、UI のためだけです。一部のユーザーがブラウザーのアドレスバーからページの URL を入力しようとすると、許可されていないメッセージを表示したいと考えています。

これまでに行ったこと:: stackpanel に名前を付けました。テキストブロックに名前を付け、ボタンに名前を付けました。許可されている場合、テキスト ブロックのテキスト値をサービスの戻り値に設定しています。

許可されていない場合は、可視性とテキストを .cs ファイルから次のように変更しています。

textblock.Text="unauthorized";
buttonname.Visibility = Visibility.Collapsed;

問題: 問題は、私がアイデアを思いついたことです。:( スタックパネルの名前がある場合、stackpanelname.Visibility = Visibility.Collapsed; と言うことができます。

しかし、今はメッセージ (Textblock) を表示できません。子コントロールも親と一緒に折りたたまれています。スタックパネル (親コントロール) を折りたたむことはできますが、そのコントロールは 1 つだけ (子コントロールは 1 つまたは少数) しか表示されません。

解決策: これを入力しているときに解決策が得られました。テキスト ブロックを使用して、可視性を VISIBLE に設定し、テキストをメッセージとして設定できる新しいスタック パネルを使用できます。しかし、それが唯一の方法ですか?これらの状況をどのように処理しますか?

一般的に、私の質問が明確であると仮定すると、UI からこの種のシナリオでセキュリティを提供するための一般的なアプローチは何ですか。エラーページ/ログインページ、または同じページのユーザーへのメッセージ、またはその他のものにリダイレクトする予定ですか。推定では、バックエンド サービスには、承認のための属性とロジックがあります。

4

1 に答える 1

1

通常、このような問題はバインディングで解決します。あなたがそのアプローチをとろうとしているかどうかはわかりませんが、あなたがそうしていることを考えると。たとえば、私はこれを行います:

<TextBlock Text="{Binding AuthorizationCaption,FallbackValue='Unauthorized'" />

ここでのフォールバック値は、設計目的でどのように見えるかを確認するために使用されます。FallbackValues は、バインディングが失敗した場合にのみ表示されます。

ボタンの場合は、次のようにします。

<Button Content="My Button" Visibility="{Binding IsAuthorized,Converter={StaticResource VisibilityValueConverter},FallbackValue=Collapsed}" />

上記の例では、VisibilityValueConverter と呼ばれるものを使用していることに気付くでしょう。もちろん、これは、XAML の「LayoutRoot」について正しく定義した私のリソースの一部になります。例えば

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/MyUICustomizationLib;component/rdMyResourceDictionary.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

私の VisibilityValueConverter は、ブール値を可視性属性に変換する単純なコンバーターです。それはかなり再利用可能です。System.Windows.Data にあると思われるIValueConverterを実装しています。線に沿って:

public class TVisibilityValueConverter:IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool _visibility = (bool)value;
        return _visibility ? Visibility.Visible : Visibility.Collapsed;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Visibility _visibility = (Visibility)value;
        return _visibility == Visibility.Visible;
    }
}

最初に、名前空間をその場所に定義することにより、値コンバーターを ResourceDictionary に埋め込みます-

xmlns:muicl="clr-namespace:MyUICustomizationLib.ValueConverters"

次に、静的リソースを定義します。

<muicl:TVisibilityValueConverter x:Key="VisibilityValueConverter" />

最後になりましたが、ビューモデルのプロパティとコマンドを実装して、必要なものに合わせます。つまり、必要なサーバー呼び出しを行い、コールバックで、それに応じて AuthorizationCaption プロパティと IsAuthorized プロパティを切り替えます。最もスムーズな方法は、AuthorizationCaption を IsAuthorized プロパティに依存する単純な if ステートメントにすることです。IsAuthorizedProperty の set メソッドで、AuthorizationCaption も変更されたというイベント通知を発生させます。例えば

set
{
    __fIsAuthorized = value;//set private member
    this.RaisePropertyChanged("IsAuthorized");
    this.RaisePropertyChanged("AuthorizationCaption");
}

もちろん、それらはあなたの側で設定する必要があるかもしれません. しかし、これは私が取るルートです。

于 2012-04-22T11:30:40.077 に答える