WPF V4-MVVM Light V4(BL16-Mix11)-RelayCommand-CanExecute不';t火

WPF V4-MVVM Light V4(BL16-Mix11)-RelayCommand-CanExecute不';t火,mvvm,mvvm-light,Mvvm,Mvvm Light,我试图在使用MVVM Light V3 Sp1的WPF V4应用程序中使用MVVM Light的最新预览版本(V4-BL16-Mix11) 在我的ViewModel中,定义了以下属性 private WifiNetwork _selectedNetwork; public WifiNetwork SelectedNetwork { get { return _selectedNetwork; }

我试图在使用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");
        }
    }
此属性绑定到视图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),则应启用“连接”按钮

这在MVVMLightV3SP1中工作得非常好。但是,当我使用MVVM Light的MIX 11预览版本时,这似乎不再有效

有什么建议吗


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

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

    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中执行此操作(在命令上手动提高RaiseCanceTechChanged)。

原因是对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
    }
//
///当发生影响命令是否应执行的更改时发生。
/// 
公共事件事件处理程序CanExecuteChanged
{
添加
{
如果(_canExecute!=null)
{
CommandManager.RequerySuggested+=值;
}
}
去除
{
如果(_canExecute!=null)
{
CommandManager.RequerySuggested-=值;
}
}
}
public void raisecancecutechanged()
{
#如果银光
var handler=CanExecuteChanged;
if(处理程序!=null)
{
处理程序(此,EventArgs.Empty);
}
#否则
CommandManager.InvalidateRequestSuggested();
#恩迪夫
}
到V3中继命令


为了解决这个问题,我必须在我的INPC属性上调用“RaiseCanExecuteChanged()”方法。我不必在MVVM Light V3 Sp1中这样做(通过命令手动提高RaiseCanceTechChanged)。到底是谁投票否决了你?!谢谢,非常感谢。您认为在生产应用程序中使用V4是不明智的吗?我错误地认为这只是测试版的新功能。我绝对不认为这是不明智的。这只是一个你应该注意的警告。顺便说一句,否决票似乎已经消失了。