2012-02-25 7 views
1

OnActivateメソッド内のビューモデルに属するすべてのコントロールの有効/無効の状態を設定しようとしています。これまでのところ問題ありませんが、ビューモデルからビューにアクセスすることなくこれを行うより良いアプローチがあるかどうかはわかりません。Caliburn.Microコントロールの状態を設定します。

答えて

3

はい、バインディングを使用します。 XAMLでは、Visibilityプロパティをビューモデルのパブリックプロパティにバインドするように設定し、標準BooleanToVisibilityConverterを使用して、ブールビューモデルのパブリックプロパティを有効なVisibility値に変換します。

ビュー要素の可視性を構成可能にするための一般的なソリューションを作成する場合は、Caliburn.Microバインディングプロセスにプラグインする方法もあります。たとえば、ViewModelBinder.BindProperties呼び出しリストに別の要素を追加できます。

私はこれをテストしていませんが、ここでこれはあなたのブートストラップのConfigure方法で行われます。同様

protected override void Configure() 
{ 
    ViewModelBinder.BindProperties += (namedElements, viewModelType) => 
    {      
     foreach (var element in namedElements) 
     { 
      // Generate a unique identifier for an element on a particular view 
      string uniqueElementId = string.Format("{0}.{1}", viewModelType.FullName, element.Name); 

      // Calculate the visibility of the element based on unique element id 
      bool elementVisible = ... 

      // Set the element's visibility 
      element.Visibility = elementVisible ? Visibility.Visible : Visibility.Collapsed; 
     } 
    }; 

    ... other configuration code 
} 

BindProperties公共Funcは、あなたのビューに名前のすべての要素のコレクションを取得しますバインドされているビューモデルのタイプとして指定します。この情報を使用して、各ビューコントロールを一意に識別し、その一意の識別子に基づいてデータから可視性を計算することができます。

各要素のVisibilityをこのようなコードに設定すると、XAMLのVisibilityプロパティに存在するすべてのバインディングが優先されます。

+0

これは、すべてのウィンドウに対してバインディングを作成する必要があることを意味します。私はカスタムコードを実行するためにScreenクラスを拡張するだけの汎用的なアプローチをしたいと思います。これの例は、ユーザーがテキストファイルを持ち、Window.control.property = falseのようなものを書き、アプリケーションがこの情報を使用して値を設定することです。ですから、私はのようなプロパティを作成し、手動でバインドする(または、キャリバーに私のためにバインドするように指示する)ことは望ましくありません。 – Eggi

+0

申し訳ありませんが、私はそれを5回読みましたが、私はあなたが何を意味するかまだ分かりません。エンドユーザーが設定できる各コントロールの可視性が必要だと言っていますか?それは恐ろしいように聞こえる、これはあなたが望むものだと確信していますか? – devdigital

+0

スーパーユーザー(データベース内)から構成可能である必要があります。したがって、アプリケーションはデータベース内で証券をチェックし、コントロールの可視性/有効化ステータスを設定します。これらのボタン/フィールドの背後にある機能は常にサーバー上にあるので、これは実際のセキュリティチェックではなく、UIに無駄なものをたくさん避けるための手段です。 – Eggi

0

これで何を達成したいのか正確にはわかりません。それにもかかわらず、ビューまたはC.MのVisualStateを使用(および変更)します。ガード方法は仕事をするかもしれません。

関連する問題