我正在研究复合MVVM应用程序并试图让Global Binding事件发生 - 除非它不是!..
默认情况下,按钮被禁用,但CanRun返回true! !我遵循了复合指南,OnLoadMenu没有开火!!!
我一直在圈子里(事件聚合器,委托命令,复合命令)它只是不工作。可以请看看这个并告诉我我错过了什么?
//xmlns:local="clr-namespace:Commands;assembly=MyApp"
<Button HorizontalAlignment="Center" Margin="1,1,1,1"
Grid.Row="2"
Command="{x:Static local:AdminGlobalCommands.LoadAdminMenu}"/>
public static class AdminGlobalCommands // In Common Code Library
{
//List All Global Commands Here
public static CompositeCommand LoadAdminMenu = new CompositeCommand();
}
public class AdminModuleViewModel : ViewModelBase, IAdminModuleViewModel // In AdminModule
{
protected IRegionManager _regionManager;
private IUnityContainer _container;
public AdminModuleViewModel(
IEventAggregator eventAggregator,
IBusyService busyService,
IUnityContainer container,
IRegionManager regionManager
)
: base(eventAggregator, busyService, container)
{
// show the progress indicator
busyService.ShowBusy();
this._regionManager = regionManager;
this._container = container;
//set up the command receivers
this.AdminShowMenuCommand = new DelegateCommand<object>(this.OnLoadAdminMenu, this.CanShowAdminMenu);
//Listen To Events
AdminGlobalCommands.LoadAdminMenu.RegisterCommand(AdminShowMenuCommand);
busyService.HideBusy();
}
public DelegateCommand<object> AdminShowMenuCommand { get; private set; }
private bool CanShowAdminMenu(object obj)
{ //Rules to Handle the Truth
return true;
}
public void OnLoadAdminMenu(object obj)
{
UIElement viewToOpen = (UIElement)_container.Resolve(typeof(AdminMenuControl)) ;
_regionManager.AddToRegion("MainRegion", viewToOpen);
_regionManager.Regions["MainRegion"].Activate(viewToOpen); ;
}
}
答案 0 :(得分:3)
如果您要创建CompositeCommand
并将monitorCommandActivity
设置为true,则使用PRISM时,您还需要了解并设置DelegateCommand.IsActive
州。
在这种情况下,CompositeCommand
将不会考虑非活动DelegateCommand
,因此您的按钮可能会保持禁用状态(例如,当{{1}中没有其他活动且可执行的DelegateCommand
时命令链)。