私はWCFサービスとデータを交換するWPFクライアントアプリケーション(MVVMパターン)を開発しています。私はレンダリングされた画面(TextBlock、TextBox、GridViewなど)のすべてのコントロールに対してIsVisibile
とIsEnabled
のプロパティを処理する効果的な方法を見つけようとしています。言い換えれば、私はユーザーが認可の観点から見る/行うことを処理する必要があります。 RelayCommand
の文脈上の文脈はすでにCanExecute
ですが、もう1つ必要です。WPFコントロールの承認
スクリーンをレンダリングする前に、(選択されたスクリーン、現在のユーザーグループ)のコントロールの設定を取得するために、リモートサービスが呼び出されるという考えがあります。返されたデータは、これは奇妙に見えるが、別のActive Directoryのグループを持っている別のサイト上でアプリケーションを実行する、ということができ
コントロール名(文字列)/でIsEnabled(ブール値)/のisVisible(ブール値)
のコレクションですそれぞれのコントロールで異なる意味とニーズを持っています。このアーキテクチャでは、各コントロールプロパティをサーバー側で構成可能にし、グループ名やコード内のすべての静的参照を削除することができます。
私の最初のアイデアは、コードビハインドでコントロールの設定を適用することでした(最後はスクリーン構築タスクです)。私は、画面のサービスを呼び出すと、サーバーからコンポーネントの設定を取得し、各Control
の画面の設定を参照するよりも。コントロール名が要素と一致する場合は、相対的な設定を適用します。これはコードのいくつかの行で行うことができるはずですが、私はRelayCommand
がその設定を後で上書きする可能性があると思います。
もう1つのアイデアは、すべてのコントロールをViewModelの相対プロパティにマップすることです。しかし、いくつかの画面では膨大な量のプロパティが付属しています。
おそらくもっと良い方法があります。コントロールの承認を処理するには、どのような方法が良いでしょうか?これは
public bool IsSaveButtonEnabled => Thread.CurrentPrincipal.IsInRole("Admin");
必要があります:あなたは、現在のユーザーの権限に応じてtrue
またはfalse
を返すビューモデル、例えばのソースプロパティにビュー内の要素のVisibility
/IsEnabled
/Command
プロパティをバインドすることができ
ありがとうございます@ mm8あなたの答えです。私は各コントロールのVMのプロパティを公開することを考えました。しかし、最後に専用のプロパティの膨大な量がある可能性があります。もっと簡潔な解決方法があるのかどうか疑問に思っていました。 WCFからのコントロールのリストを返す背後にあるアイデアは、アプリケーションが異なる独立したサイトに対して実行されなければならないためです。さらに、各サイトには独自のADグループ(そのサイトにのみ意味がある)とその制御/グループ設定があります。 WCFは、SQL構成テーブルから返された現在のユーザーグループのACLを返します。 – gipinani
IsEnabledプロパティをバインドして、パネル全体、つまりコントロールのグループを無効にすることができます。 – mm8
はいtrue ..しかし、私はより細かい粒度が必要です。とにかくあなたの時間のおかげで..今のところ:) – gipinani