#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;
}
Также взгляните на эти статьи, я думаю, вы найдете их полезными.