【问题标题】:WPF V4 - MVVM Light V4 (BL16 - Mix11) - RelayCommand - CanExecute doesn't fireWPF V4 - MVVM Light V4 (BL16 - Mix11) - RelayCommand - CanExecute 不触发
【发布时间】:2011-08-26 14:29:03
【问题描述】:

我正在尝试在使用 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 中完美运行。但是当我使用 MIX 11 预览版的 MVVM-Light 时,这似乎不再起作用了。

有什么建议吗?

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

【问题讨论】:

  • 为了解决这个问题,我不得不在我的 INPC 属性上调用“RaiseCanExecuteChanged()”方法。我不必在 MVVM-Light V3 Sp1 中执行此操作(在命令上手动提高 RaiseCanExecuteChanged)。

标签: mvvm mvvm-light


【解决方案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)。

【讨论】:

    【解决方案2】:

    原因是对 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

    【讨论】:

    • 到底谁对你投了反对票?!谢谢你,非常感谢。您认为在生产应用程序中使用 V4 是不明智的吗?我错误地认为它只是测试版的新功能。
    • 我绝对不认为这是不明智的。这只是您应该注意的警告。顺便说一句,downvote 似乎已经消失了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多