4

Prism と MVVM を使用して WPF アプリケーションを開発しています。

アプリケーションの要件の 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>

私の質問は、RasieCanExecuteChanged を呼び出すことができるように、そのプロパティのタイプを特定し、その特定のタイプにキャストする方法です。DelegateCommand<T>

4

2 に答える 2

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();
    }
}
于 2012-02-22T23:23:18.633 に答える
0

ビューモデルでプロパティの変更を監視し、監視対象のプロパティが変更された場合にのみ 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 を呼び出したりすることなく、どの変数がコマンドに影響を与えるかを細かく制御できます。

于 2015-05-22T10:43:11.060 に答える