Все, что я хочу сделать, это передать параметр из xaml в модель представления.Событие CanExecuteChanged не запускается для моей команды, чтобы включить кнопку, которая выполняет операцию.
У меня нет проблем с выполнением этой логики, если в viewmodel не передан ни один параметр.
Я думаючто-то должно быть изменено в моем классе Relaycommand.Может кто-нибудь, пожалуйста, помогите мне настроить это правильно?Я просмотрел ответы на этот тип вопросов, но все еще не могу включить кнопку «Удалить» для выполнения метода DeleteThanks.
В методе ICommand.CanExecute класса RelayCommand _TargetCanExecuteMethod & _TargetExecuteMethodвсегда нулевые;поэтому, не выполняя метод CanDeleteThanks в viewmodel.
Обратите внимание, что второй метод RelayCommand в том же именованном классе необходимо было вставить туда из-за подписи команды Delete.Однако эти объекты внутри этого метода не реализованы в методе ICommand.CanExecute.
Вот мой xaml:
<Button x:Name="btnDelete"
Content="Delete"
Command="{Binding DeleteThanksCommand}"
CommandParameter="{Binding Text, ElementName=Subject}"
IsEnabled="{Binding DeleteEnabled}"
HorizontalAlignment="Left"
Grid.Row="0"
Grid.Column="0" Foreground="#FF0C1334">
</Button>
Вот моя модель представления:
public GiveThanksViewModel()
{
DeleteThanksCommand = new RelayCommand(param => DeleteThanks(param), param => CanDeleteThanks(param));
}
private bool _DeleteEnabled;
public bool DeleteEnabled
{
get
{
return _DeleteEnabled;
}
set
{
if (_DeleteEnabled != value)
{
_DeleteEnabled = value;
}
}
}
public RelayCommand DeleteThanksCommand { get; private set; }
private void DeleteThanks(object action)
{
try
{
...
DeleteEnabled = false;
DeleteThanksCommand.RaiseCanExecuteChanged();
}
}
catch (Exception ex)
{
messageService.ShowNotification(ex.Message);
}
}
private bool CanDeleteThanks(object parameter)
{
return DeleteEnabled;
}
Вот класс Relaycommand:
public class RelayCommand : ICommand
{
Action _TargetExecuteMethod;
Func<bool> _TargetCanExecuteMethod;
private Action<object> action;
private Func<object, bool> canDeleteThanks;
public RelayCommand(Action executeMethod, Func<bool> canExecuteMethod)
{
_TargetExecuteMethod = executeMethod;
_TargetCanExecuteMethod = canExecuteMethod;
}
public RelayCommand(Action<object> action, Func<object, bool> canDeleteThanks)
{
this.action = action;
this.canDeleteThanks = canDeleteThanks;
}
public void RaiseCanExecuteChanged()
{
CanExecuteChanged(this, EventArgs.Empty);
}
#region ICommand Members
bool ICommand.CanExecute(object parameter)
{
if (_TargetCanExecuteMethod != null)
{
return _TargetCanExecuteMethod();
}
if (_TargetExecuteMethod != null)
{
return true;
}
return false;
}
// Beware - should use weak references if command instance lifetime is longer than lifetime of UI objects that get hooked up to command
// Prism commands solve this in their implementation
public event EventHandler CanExecuteChanged = delegate { };
void ICommand.Execute(object parameter)
{
if (_TargetExecuteMethod != null)
{
_TargetExecuteMethod();
}
}
#endregion
}
Вот другая половина кода в том же классе RelayCommand, который никогда не выполняется при отладке.Я думаю, что приведенный ниже код должен быть выполнен из-за моего параметра.
public class RelayCommand<T> : ICommand
{
Action<T> _TargetExecuteMethod;
Func<T, bool> _TargetCanExecuteMethod;
public RelayCommand(Action<T> executeMethod, Func<T,bool> canExecuteMethod)
{
_TargetExecuteMethod = executeMethod;
_TargetCanExecuteMethod = canExecuteMethod;
}
public void RaiseCanExecuteChanged()
{
CanExecuteChanged(this, EventArgs.Empty);
}
#region ICommand Members
bool ICommand.CanExecute(object parameter)
{
if (_TargetCanExecuteMethod != null)
{
T tparm = (T)parameter;
return _TargetCanExecuteMethod(tparm);
}
if (_TargetExecuteMethod != null)
{
return true;
}
return false;
}
// Beware - should use weak references if command instance lifetime is longer than lifetime of UI objects that get hooked up to command
// Prism commands solve this in their implementation
public event EventHandler CanExecuteChanged = delegate { };
void ICommand.Execute(object parameter)
{
if (_TargetExecuteMethod != null)
{
_TargetExecuteMethod((T)parameter);
}
}
#endregion
}