【问题标题】:WPF MVVM and CommandsWPF MVVM 和命令
【发布时间】:2012-07-11 20:09:36
【问题描述】:

我正在尝试创建一个利用命令的 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 属性,但是从我阅读的内容来看,这似乎需要很多工作。

【问题讨论】:

    标签: c# wpf xaml mvvm command


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 2010-11-06
      • 2017-08-02
      • 2011-04-04
      相关资源
      最近更新 更多