在擺弄MVVM指示燈以讓我的按鈕啓用和禁用時,我希望它可以......我把各種東西混合在一起,直到它工作。我知道我在做錯RaiseCanExecuteChanged和CanExecute錯誤
但是,我只知道我在這裏做錯了什麼。我有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();
}
}
經進一步思考,它甚至沒有正常工作。它啓用按鈕...但是它不會禁用它。 – Cowman
如果我使用MVVM light的RelayCommand而不是DelegateCommand ...事情似乎正常工作。 難道這真的是問題的根源嗎?如果是這樣,那看起來很愚蠢。 – Cowman