Я работал над некоторыми примерами MVVM & WPF, и, выполняя некоторую отладку, я обнаружил, что RelayCommand, связанный с кнопкой на моем представлении, постоянно запускается (выполняется связанный с ним ImportHoursCommand) как как только начнется программа.WPF & RelayCommand - кнопка всегда срабатывает
Вот фрагменты кода:
Посмотреть
<Button x:Name="ImportHoursButton" Content="Import Hours"
Command="{Binding ImportHoursCommand}"
Height="25" Width="100" Margin="10"
VerticalAlignment="Bottom" HorizontalAlignment="Right"
Grid.Row="1" />
ViewModel
private RelayCommand _importHoursCommand;
public ICommand ImportHoursCommand
{
get
{
if (_importHoursCommand == null)
{
_importHoursCommand = new RelayCommand(param => this.ImportHoursCommandExecute(),
param => this.ImportHoursCommandCanExecute);
}
return _importHoursCommand;
}
}
void ImportHoursCommandExecute()
{
MessageBox.Show("Import Hours",
"Hours have been imported!",
MessageBoxButton.OK);
}
bool ImportHoursCommandCanExecute
{
get
{
string userProfile = System.Environment.GetEnvironmentVariable("USERPROFILE");
string currentFile = @userProfile + "\\download\\test.txt";
if (!File.Exists(currentFile))
{
MessageBox.Show("File Not Found",
"The file " + currentFile + " was not found!",
MessageBoxButton.OK);
return false;
}
return true;
}
}
Если я ставлю точку останова на строке 'Userprofile = ...' строки и запустите программу, Visual Studio остановится в точке останова и продолжит останавливаться на кануне контрольной точки rytime Я нажимаю кнопку отладки «Продолжить». Если у меня нет точки останова, программа работает нормально, но должна ли эта команда всегда проверять, может ли она выполняться?
Я использую RelayCommand из статьи here от Джоша Смита.
ОК, это имеет смысл тогда. Примеры, которые я прошел, не дали понять, что CanExecute управляет самой кнопкой. Я думал, что это способ определить, можно ли выполнить команду. – BrianKE
@BrianKE Нет, если вы когда-либо запускаете свой 'Command.Execute()' вручную, обязательно запустите 'Command.CanExecute()' first – Rachel