2012-02-22 17 views
4

PrismとMVVMを使用してWPFアプリケーションを開発しています。すべてのDelegateCommandとDelegateCommandに対してRaiseCanExecuteChangedを呼び出す方法

アプリケーションの要件の1つは、異なる権限(異なる権限)でログインできることです。

現在、ほとんどのアクセス許可は、特定の表示を許可または禁止する単純なものです。 これらはすべてDelegateCommandまたはDelegateCommand<T>として実装されています

これらのコマンドのCanExecuteは、ユーザーが特定のビューを表示する権限を持っている場合にtrueを返します。 また、ユーザー情報とアクセス許可を保持するシングルトンSessionmanagerがあります。

ユーザーがログインすると、EventAggregatorを使用してイベントが発生しています。 すべてのViewModelの基本クラスです。私はそのイベントに登録しており、反射を使用しています DelegateCommand型のVMのすべてのパブリックプロパティをループし、そのコマンドに対してRaiseCanExecuteChangedを呼び出します。

 Type myType = this.GetType(); 
     IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties()); 

     foreach (PropertyInfo prop in props) 
     { 
      if (prop.PropertyType == typeof(DelegateCommand)) 
      { 
       var cmd = (DelegateCommand)prop.GetValue(this, null); 
       cmd.RasieCanExecuteChanged(); 
      } 

     } 

これは、すべての非ジェネリックDelegateCommandの特性に適していますが、もちろんDelegateCommand<T>には影響を与えません。

私の質問はです。そのプロパティがタイプDelegateCommand<T>であることを確認し、その特定の型にキャストしてRasieCanExecuteChangedを呼び出す方法はありますか?

答えて

7

あなたは、プロパティのタイプがDelegateCommandBaseから派生するかどうかをチェックし、もしそうであればできる - DelegateCommandBaseにキャストし、RaiseCanExecuteChangedを呼び出します。

Type myType = this.GetType(); 
IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties()); 

foreach (PropertyInfo prop in props) 
{ 
    if (prop.PropertyType.IsSubclassOf(typeof(DelegateCommandBase))) 
    { 
     var cmd = (DelegateCommandBase)prop.GetValue(this, null); 
     cmd.RaiseCanExecuteChanged(); 
    } 
} 
+0

ありがとう!ジェネリッククラスを非ジェネリックベースにキャストすることが可能であるかどうかはわかりませんでした。 –

0

が、私は別のアプローチを好む、その後のviewmodel上のプロパティの変更を見て、上のリレーが、私はここでそれについて投稿し、私の監視対象のプロパティが変更されたときにのみraisecanexecutechanged上昇:へ

https://stackoverflow.com/a/30394333/1716620

感謝

this.SaveCommand = new MyDelegateCommand<MyViewModel>(this, 
    //execute 
    () => { 
     Console.Write("EXECUTED"); 
    }, 
    //can execute 
    () => { 
     Console.Write("Checking Validity"); 
     return PropertyX!=null && PropertyY!=null && PropertyY.Length < 5; 
    }, 
    //properties to watch 
    (p) => new { p.PropertyX, p.PropertyY } 
); 

このようにすれば、どのような変数を細かく制御できますか一般的なコードをたくさん置かなくても、コマンドに影響を与えることができます。必要がない場合はRaiseCanExecuteChangedを呼び出します。