Я разрабатываю приложение WPF с использованием Prism и MVVM.
Одним из требований приложения является возможность входа в систему от имени другого пользователя (с разными разрешениями).
Теперь большинство разрешений просто разрешать или запрещать отображение определенного вида.
Все они реализованы как DelegateCommand
или иногда как DelegateCommand<T>
CanExecute для этих команд возвращает true, если у пользователя есть разрешение на отображение определенного представления.
Также у меня есть одноэлементный Sessionmanager, который содержит информацию о пользователях и разрешения.
Когда пользователь вошел в систему, я запускаю событие, используя EventAggregator.
в базовом классе для всех ViewModels я подписываюсь на это событие и использую отражение
переберите все открытые свойства виртуальной машины, относящиеся к типу DelegateCommand, и вызовите 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?