WPF V4 - MVVM Light V4(BL16 - Mix11) - RelayCommand - CanExecute不会触发

时间:2011-05-16 16:36:31

标签: mvvm mvvm-light

我正在尝试在使用MVVM-light V3 Sp1的WPF v4应用程序中使用最新的MVVM-Light预览版(V4-BL16-Mix11)。

在我的ViewModel中,我定义了以下属性

    private WifiNetwork _selectedNetwork;
    public WifiNetwork SelectedNetwork 
    {
        get
        {
            return _selectedNetwork;
        }
        set
        {
            if (_selectedNetwork == value)
                return;

            _selectedNetwork = value;
            RaisePropertyChanged("SelectedNetwork");
        }
    }

此属性绑定到View XAML中的ListBox的SelectedItem。

我在viewModel中定义了以下RelayCommand

    private RelayCommand _connectCommand;
    public RelayCommand ConnectCommand
    {
        get
        {
            if (_connectCommand == null)
            {
                _connectCommand = new RelayCommand(
                    () => ConnectToSpecifiedNetwork(SelectedNetwork),
                    () => SelectedNetwork != null && ! SelectedNetwork.IsConnected);
            }

            return _connectCommand;
        }
    }

此RelayCommand绑定到我的“连接”按钮。

如果所选项目尚未连接(IsConnected为false),则应启用连接按钮。

这在MVVM-Light V3 Sp1中非常完美。但是当我使用MVVM-Light的MIX 11预览版时,这似乎不再起作用了。

有什么建议吗?

如果需要,我可以将我的整个项目上传到某个地方..

2 个答案:

答案 0 :(得分:1)

为了解决这个问题,我不得不在我的INPC属性上调用“RaiseCanExecuteChanged()”方法,如下所示

    private WifiNetwork _selectedNetwork;
    public WifiNetwork SelectedNetwork 
    {
        get
        {
            return _selectedNetwork;
        }
        set
        {
            if (_selectedNetwork == value)
                return;

            _selectedNetwork = value;

            RaisePropertyChanged("SelectedNetwork");
            // FIX - raise the CanExecuteChanged on the command.
           _connectCommand.RaiseCanExecuteChanged();
        }
    }

我无需在MVVM-Light V3 Sp1中执行此操作(在命令上手动提升RaiseCanExecuteChanged)。

答案 1 :(得分:1)

原因是删除了对CommandManager的调用。如果将其添加回来,则无需手动提升。但这在Silverlight中不起作用。以下是V3中似乎已删除的代码:

    /// <summary>
    /// Occurs when changes occur that affect whether the command should execute.
    /// </summary>
    public event EventHandler CanExecuteChanged
    {
        add
        {
            if (_canExecute != null)
            {
                CommandManager.RequerySuggested += value;
            }
        }

        remove
        {
            if (_canExecute != null)
            {
                CommandManager.RequerySuggested -= value;
            }
        }
    }

    public void RaiseCanExecuteChanged()
    {
#if SILVERLIGHT
        var handler = CanExecuteChanged;
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
#else
        CommandManager.InvalidateRequerySuggested();
#endif
    }

Link到V3 RelayCommand

Link到V4 RelayCommand