0

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

假设我的视图模型看起来像这样,其中对象 ViewModel 继承了 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 属性,但是从我阅读的内容来看,这似乎是很多工作,命令已经这样做了。

4

1 回答 1

0

您需要在CanExecuteChanged要重新评估的命令上引发事件,在这种情况下,当那个可怕的匈牙利布尔值发生变化时应该这样做。

(我建议只制作命令字段readonly和属性get,命令通常不会更改)

于 2012-07-11T20:13:47.873 回答