2012-03-06 63 views
0

我正在使用棱镜2,试图在模块使用的shell中添加四个导航按钮(第一条记录,最后一条记录,上一条记录,下一条记录)。我还希望这些按钮被禁用,如果活动View/ViewModel不提供这些功能。由模块共享的棱镜壳按钮

我尝试使用事件,但不知道如何实现我关于禁用按钮的第二个目标。看来我需要检查当前的活动View/ViewModel,看他们是否在View切换期间订阅了点击事件。但我认为出版商应该不知道用户...

不知何故,我尝试了我自己的方式。我创建了一个IDocNavigation接口,其中有四个方法与我的四个按钮相对应。在运行时,我检查模块的ViewModel是否实现了该接口,并更改ICommand。以下是我的代码。我只包含一个LastRecordCommand:

public ShellViewModel(Views.Shell shell) 
{ 
this.Shell = shell; 
shell.DataContext = this; 

shell.MainDocking.ActivePaneChanged += (s, e) => 
{ 
    if (e.NewPane.Content is UserControl && 
     ((UserControl)e.NewPane.Content).DataContext is IDocumentNavigate) 
    { 

     IDocumentNavigate vm = ((UserControl)e.NewPane.Content).DataContext as IDocumentNavigate; 
     LastRecordCommand = new RelayCommand(x => vm.GotoLastRecord(), x => true); 
    } 
    else 
    { 
     LastRecordCommand = new RelayCommand(x => { }, x => false); 
    } 

}; 
//... 

我觉得这些都很难看。创建一个空的RelayCommand也很愚蠢。我该如何改进?或者如果事件更适合我的话,我该如何实现禁用命令?

回答

0

您可以在棱镜中使用CompositeCommand。

定义可用CompositeCommand

public static readonly CompositeCommand FirstRecord= new CompositeCommand(true); 

然后,在全球范围内的你的模块视图模型

class Module1 
    { 


     public DelegateCommand Module1Firstrecord{ get; set; } 
     Module1() 
     { 
      Module1Firstrecord = new DelegateCommand(this.FirstRecord, CanExecute); 
     } 

     private void FirstRecord() 
     { 
     //do whatever you want 

     } 

     private bool CanExecute() 
     { 
       return true; 
     } 

     private void Module1_IsActiveChanged(object sender, EventArgs e) 
     { 
     //Find if your window is acive 
     // if it is active Module1Firstrecord.IsActive = true  
     //else false. 
     } 
} 

随着IActiveAware您可以轻松地处理活动窗口的场景。根据您的活动模块是否具有该命令的处理程序,而不是该按钮将启用/禁用。