- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 Prism 和 MVVM 开发 WPF 应用程序。
应用程序的要求之一是能够以不同的用户身份(具有不同的权限)登录。
现在大多数权限都是简单的允许或禁止显示特定 View 。所有这些都实现为 DelegateCommand
或者有时作为 DelegateCommand<T>
如果用户有权显示特定 View ,则这些命令的 CanExecute 返回 true。我还有一个保存用户信息和权限的单例 Sessionmanager。
当用户登录时,我使用 EventAggregator 触发一个事件。在所有 ViewModel 的基类中,我订阅该事件并使用反射遍历 DelegateCommand 类型的 VM 的所有公共(public)属性,并为该命令调用 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 的特定类型?
最佳答案
您可以检查属性的类型是否派生自 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();
}
}
关于c# - 如何为基础 ViewModel 类中的所有 DelegateCommand 和 DelegateCommand<T> 调用 RaiseCanExecuteChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9403505/
我有一个如下所示的数据框: person n start end 1 sam 6 0 6 2 greg 5 6 11 3 te
直到大约 1-2 个月前 android构建(任何应用程序的)在 Android Galaxy S 上完美运行.现在无法在此设备上安装 buid。我添加了标志 codename1.arg.androi
背景: 我的类(class)名为 ObjectListModel继承QAbstractListModel并包含 QObjectList .对象是行,它们的属性是列(使用 QMetaObject 设置)
我有一个 flex div (.parent) 和包含更多行的子 div(您猜对了,.child)。我的问题是我似乎无法在不破坏我的“网格”的情况下让每个 div .card 的边框具有相同的高度。当
我是一名优秀的程序员,十分优秀!