在摆弄MVVM灯以使我的按钮在我想要的时候启用和禁用之后……我有点把事情拼凑在一起,直到它起作用。
然而,我只知道我在这里做错了什么。我在被调用的同一区域中有RaiseCanExecuteChanged和CanExecute。事情肯定不是这样的吧?
这是我的xaml
<Button Margin="10, 25, 10, 25" VerticalAlignment="Center" HorizontalAlignment="Center" Width="50" Height="50" Grid.Column="1" Grid.Row="3" Content="Host">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<mvvmLight:EventToCommand Command="{Binding HostChat}" MustToggleIsEnabled="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
这是我的代码
public override void InitializeViewAndViewModel()
{
view = UnityContainer.Resolve<LoginPromptView>();
viewModel = UnityContainer.Resolve<LoginPromptViewModel>();
view.DataContext = viewModel;
InjectViewIntoRegion(RegionNames.PopUpRegion, view, true);
viewModel.HostChat = new DelegateCommand(ExecuteHostChat, CanHostChat);
viewModel.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(ViewModelPropertyChanged);
}
void ViewModelPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == "Name" || e.PropertyName == "Port" || e.PropertyName == "Address")
{
(viewModel.HostChat as DelegateCommand).RaiseCanExecuteChanged();
(viewModel.HostChat as DelegateCommand).CanExecute();
}
}
public void ExecuteHostChat()
{
}
public bool CanHostChat()
{
if (String.IsNullOrEmpty(viewModel.Address) ||
String.IsNullOrEmpty(viewModel.Port) ||
String.IsNullOrEmpty(viewModel.Name))
{
return false;
}
else
return true;
}
看看这两个是怎么在一起的?这肯定是不对的。我的意思是。。。它对我有用…但似乎有点不对劲。RaiseCanExecuteChanged不应该调用CanExecute吗?它不是。。。因此,如果我没有CanExecute,我的控件永远不会像我需要的那样切换它的IsEnabled。
(viewModel.HostChat as DelegateCommand).RaiseCanExecuteChanged();
(viewModel.HostChat as DelegateCommand).CanExecute();
编辑:
如果我最终使用按钮的Command属性将我的命令绑定到……一切都很好。我可以删除CanExecute,只保留RaiseCanExecuteChanged,一切都很顺利。
像这样。。。这很好用。
<Button Command="{Binding HostChat}" Margin="10, 25, 10, 25" VerticalAlignment="Center" HorizontalAlignment="Center" Width="50" Height="50" Grid.Column="1" Grid.Row="3" Content="Host">
</Button>
void ViewModelPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == "Name" || e.PropertyName == "Port" || e.PropertyName == "Address")
{
(viewModel.HostChat as DelegateCommand).RaiseCanExecuteChanged();
//(viewModel.HostChat as DelegateCommand).CanExecute();
//CommandManager.InvalidateRequerySuggested();
}
}
CanExecute
方法只返回命令是否可以执行。它不做任何其他事情。您只需要RaiseCanExecuteChanged
。在您的情况下,RaiseCanExecuteChanged
将呼叫CanHostChat
。