2012-04-21 5 views
1

私はsilverlight WebアプリケーションにホストされているSilverlight Webアプリケーション(RIA)に取り組んでいます。silverlightのstackpanel可視性編集

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

My xamlページにはスタックパネルがあり、そのスタックパネルにはテキストブロックとボタンしかありません。 xamlページにナビゲートすると、承認されたユーザーだけがテキストブロック内の値を表示できます。ユーザーが承認されていない場合、私はテキストブロックに値の代わりに "承認されていない"メッセージを表示することを計画しています(ボタンも表示されません)。

FYIのこの値はWCFサービス私はそのサービスの承認のための適切な属性を作っています。権限がない場合、値はサービスからのテキストブロックには到着しません。私が今やっていることは、UIのためだけです。ブラウザのアドレスバーからページのURLを入力しようとすると、不正なメッセージが表示されます。

私はこれまで何をしていますか::私はスタックパネルに名前を与えました。私はテキストブロックに名前を付け、ボタンに名前を付けました。許可されている場合は、テキストブロックのテキスト値をサービス戻り値に設定しています。

権限がない場合は、表示とテキストを.csファイルから変更しています。

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

問題:問題が発生しました。 :(私がスタックパネルの名前を持っていたら、 stackpanelname.Visibility = Visibility.Collapsed;

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

ソリューション:私はこれをタイプしているので、新しいスタックパネル用のテキストブロックがあり、私はVISIBLEとテキストをメッセージとして設定できますが、それは唯一の方法ですか?

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

答えて

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は、ブール値を可視性属性に変換する簡単なコンバータです。それはかなり再利用可能です。それはIValueConverterを実装しています。にあります。System.Windows.Data

<muicl:TVisibilityValueConverter x:Key="VisibilityValueConverter" /> 
: - :ラインに沿って続いて静的リソースを定義する

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

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で私の値コンバータを埋め込みます

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

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

もちろん、あなたのために設定する必要があります。しかし、これは私が取るだろうルートです。

関連する問題