Параметр relaycommand передать wpf - PullRequest
0 голосов
/ 26 сентября 2018

Все, что я хочу сделать, это передать параметр из 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
    }

1 Ответ

0 голосов
/ 27 сентября 2018

Я заставил его работать, изменив следующее:

В ViewModel я изменил на исходный код следующее:

DeleteThanksCommand = new RelayCommand<object>((parms) => DeleteThanks(parms), parms => CanDeleteThanks());

public RelayCommand<object> DeleteThanksCommand { get; private set; }
...