2012-07-11 109 views
0

我想创建一个利用命令的WPF应用程序,但我遇到了启用菜单按钮的命令问题。我正在做一些简单的验证,在这种情况下,“保存”按钮被禁用,直到用户创建一个新文档或加载一个现有的文档。WPF MVVM和命令

比方说我的视图模型看起来是这样的,其中视图模型将继承INotifyPropertyChanged的对象:

public ViewModel() 
{ 
    New = new RelayCommand(OnNew, CanNew); 
    Save = new RelayCommand(OnSave, CanSave); 
} 

ICommand m_cmdNew; 

public ICommand New 
{ 
    get { return m_cmdNew; } 
    set 
    { 
     m_cmdNew = value; 
     OnPropertyChanged("New"); 
    } 
} 

void OnNew(object param) 
{ 
    bCanSave = true; 
    // I read that this could resolve my problem. 
    CommandManager.InvalidateRequerySuggested(); 
} 

bool CanNew( object param) 
{ 
    return true; 
} 

让我们假设我在做同样的事情为“保存”命令为好,唯一的例外是“CanSave “是这样的:

bool CanSave(object param) 
{ 
    return bCanSave; 
} 

我的XAML:

<Menu> 
    <MenuItem Header="Text"> 
     <MenuItem Header="New" Command="{Binding New}"/> 
     <MenuItem Header="Save" Command="{Binding Save}"/> 
    </MenuItem> 
</Menu> 

的我遇到的问题是在更改变量“bCanSave”后,CanSave方法从未被调用。我怎样才能做到这一点?我知道我可以简单地创建一个属性,并使用INotifyPropertyChanged和XAML绑定,我可以简单地切换IsEnabled属性,但是从我阅读的内容来看,这看起来像很多工作,命令已经这样做了。

回答

0

您需要提高CanExecuteChanged事件上您要重新评估的命令,在这种情况下,应该在可怕的匈牙利布尔变化时完成。

(我会建议使命令字段readonly和属性get - 只是,命令通常不会改变)