SelectedItem已在Silverlight中更改并执行命令

时间:2011-11-05 15:20:15

标签: silverlight silverlight-4.0 command

我是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这样的东西。

1 个答案:

答案 0 :(得分:0)

您的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