Выбранный элемент изменен и команды в Silverlight

#silverlight #silverlight-4.0 #command

#silverlight #silverlight-4.0 #команда

Вопрос:

Я новичок в Silverlight, и у меня есть некоторые проблемы с командами. У меня есть DataGrid, который привязан к ObservableCollection в моей ViewModel. У меня также есть кнопка

 <Button Command="{Binding AddCommand}">Add</Button>
  

какое свойство команды привязано к команде ViewModel.
Командный класс выглядит следующим образом

 public class GenericCommand : ICommand
    {

        public event EventHandler CanExecuteChanged;
        private Action<object> execute;
        private Func<object, bool> canExecute;
        private bool previousState;
        public GenericCommand(Action<object> execute, Func<object, bool> canExecute)
        {
            this.execute = execute;
            this.canExecute = canExecute;

        }

        public bool CanExecute(object parameter)
        {
            if (canExecute == null) return false;
            bool currentState = canExecute(parameter);
            if (currentState != previousState)
            {
                previousState = currentState;
                if (CanExecuteChanged != null)
                    CanExecuteChanged(this, new EventArgs());
                return currentState;
            }
            return currentState;

        }

        public void Execute(object parameter)
        {
            if (execute == null) return;
            execute(parameter);
        }
    }
  

свойство addCommand было создано таким образом

 AddCommand = new GenericCommand(Add,CanAdd);
 public bool CanAdd(object param)
        {
            return SelectedItem != null;
        }
    public void Add(object param)
        {

        }
  

Проблема в том, что кажется, что привязка команд не реагирует на изменения выбранного элемента. Если я запускаю свое приложение, ни одна из строк сетки не выбрана, я вижу, что вызывается функция CanAdd. Однако, если я нажимаю на какой-либо элемент, функция CanAdd не вызывается — несмотря на то, что я вижу, что свойство SelectedItem в модели представления изменилось?? Что я делаю не так?
Возможно ли использовать команды без использования какой-либо внешней библиотеки?
Раньше я писал аналогичный код в WPF, однако в WPF в классе GeneriCommand я использовал

  public event EventHandler CanExecuteChanged
        {
            add
            {
                CommandManager.RequerySuggested  = value;
            }
            remove
            {
                CommandManager.RequerySuggested -= value;
            }
        }
  

Проблема в том, что в Silverlight нет такой вещи, как CommandManager.

Ответ №1:

В вашей ViewModel необходимо будет реализовать интерфейс INotifyDataErrorInfo. Также метод CanAdd необходимо изменить на что-то вроде этого.

 if (SelectedItem == null)
{
     base.AddValidationErrorMessage("SelectedItem", "Select something....");
     return false;
}
else
{
     base.RemoveValidationErrorMessage("SelectedItem");
     return true;
 }
  

Также взгляните на эти статьи, я думаю, вы найдете их полезными.

http://weblogs.asp.net/fredriknormen/archive/2010/01/09/silverlight-about-validation-when-binding-to-custom-forms-part-2-using-silverlight-4.aspx

http://weblogs.asp.net/fredriknormen/archive/2009/11/22/silverlight-4-and-asynchronous-validation-with-inotifydataerrorinfo.aspx