我正在尝试在使用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预览版时,这似乎不再起作用了。
有什么建议吗?
如果需要,我可以将我的整个项目上传到某个地方..
答案 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