OK. Вот сценарий. Это WPF + MVVM (.net 4.0) приложение:Как вызвать ICommand.CanExecute в этом случае?
- Вид: Имеет
DataGrid
и две кнопки Вверх/Вниз, которые, как предполагается, чтобы переместить выбранную запись вверх или вниз вDataGrid
. И сетка, и кнопки используют привязку на основе XAML. - ViewModel: имеет общедоступное свойство
DataView
, к которому привязано моеDataGrid
. Затем есть две версииICommand
, перечисленные ниже. Эти две команды свяжутся с двумя кнопками. И последнее, но не менее важное, есть две функции:MoveUp()
иMoveDown()
, которые делают очевидные. - Два
ICommand
реализация: В каждой команде,CanExecute()
возвращает ли выбранная запись может перемещаться вверх или вниз, соответственно, иExecute()
фактически перемещает запись по телефонуMoveUp()
иMoveDown()
функции ViewModel, я описанная выше. Эти объекты команд получают ссылку на объект VM в своих конструкторах.
Во-первых, я хочу знать, правильная ли эта архитектура и соответствие шаблону MVVM? Во-вторых, проблема под рукой, что мои кнопки не получить включен/выключен при изменении выбранной записи в DataGrid
, которая воспитывает 2 подвопросы:
- Кто называет
CanExecute()
и когда? - Как это можно назвать вручную? Я пробовал
CommandManager.InvalidateRequerySuggested()
после прочтения некоторых других вопросов, но это тоже не помогло.
Вот мой CommandBase
класс, из которого оба мои классы команд унаследовать:
internal abstract class CommandBase : DependencyObject, ICommand
{
public virtual bool CanExecute(Object parameter)
{
return true;
}
public abstract void Execute(Object parameter);
public event EventHandler CanExecuteChanged;
protected void OnCanExecuteChanged(Object sender, EventArgs e)
{
CanExecuteChanged(sender, e);
}
}
Какую версию 'ICommand' вы используете? –
Что вы подразумеваете под версией? в 'System.Windows.Input' (PresentationCore.dll 4.0.0) есть только одна« ICommand ». – dotNET
Да, я имел в виду 'DelegateCommand' или' RelayCommand' или собственную производную реализацию 'ICommand'? –