SelectedItem изменился и команды в Silverlight - PullRequest
0 голосов
/ 05 ноября 2011

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

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

какое свойство Command связано с командой 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)
        {

        }

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

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

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

1 Ответ

0 голосов
/ 06 ноября 2011

Ваша 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/2009/11/22/silverlight-4-and-asynchronous-validation-with-inotifydataerrorinfo.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...