我是Silverlight的新手,我有一些关于命令的问题。我有一个DataGrid,它绑定到我的ViewModel中的ObservableCollection。我也有一个按钮
<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中编写类似的代码但是在我使用的GeneriCommand类的WPF中
public event EventHandler CanExecuteChanged
{
add
{
CommandManager.RequerySuggested += value;
}
remove
{
CommandManager.RequerySuggested -= value;
}
}
问题是在Silverlight中没有像CommandManager这样的东西。
答案 0 :(得分:0)
您的ViewModel需要实现INotifyDataErrorInfo接口。此外,CanAdd方法需要更改为类似的内容。
if (SelectedItem == null)
{
base.AddValidationErrorMessage("SelectedItem", "Select something....");
return false;
}
else
{
base.RemoveValidationErrorMessage("SelectedItem");
return true;
}
另外看看这些文章,我想你会发现它们很有用。