首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RelayCommand类问题

RelayCommand类问题
EN

Stack Overflow用户
提问于 2014-01-03 09:14:28
回答 2查看 2.1K关注 0票数 1

我是MVVM的新手。我已经创建了一个RelayCommand类,但是lambda表达式出现了一些错误。

代码语言:javascript
复制
AddTitleCommand = new RelayCommand(o => true, o => Items.Add(new MyTitleModel()));

这一行代码返回一个错误,上面写着:

只允许赋值、调用、增量、递减、等待和新的对象表达式作为语句使用。

代码语言:javascript
复制
AddQuestionCommand = new RelayCommand(o => Items.Any(), o =>
{
            var title = this.Items.OfType<MyTitleModel>().LastOrDefault();
            Items.Add(new MyQuestionModel() { Title = title });
}); 

这一行代码正在返回错误,上面写着:

并非所有代码路径都返回类型为'System.Predicate < object>'的lambda表达式中的值。

最后,在实际的类中,有两个属性需要引用,而我似乎无法在互联网上找到它们:

代码语言:javascript
复制
if (_myCommand == null)
{
            _myCommand = new RelayCommand(p => this.DoMyCommand(p),
                p => this.CanDoMyCommand(p));
}

DoMyCommandCanDoMyCommand错误地说:

'RelayCommand‘不包含'DoMyCommand’的定义,也找不到接受'RelayCommand‘类型的第一个参数的扩展方法'DoMyCommand’(您缺少使用指令还是程序集引用?)。

EDIT1:

这是我的另一个代码:

代码语言:javascript
复制
RelayCommand _myCommand;
public ICommand MyCommand
{
    get
    {
        if (_myCommand == null)
        {
            _myCommand = new RelayCommand(p => this.DoMyCommand(p),
                p => this.CanDoMyCommand(p));
        }
        return _myCommand;
    }
}

EDIT2:

下面是RelayCommand构造函数:

代码语言:javascript
复制
#region Constructors

public RelayCommand(Action<object> execute)
    : this(execute, null)
{
}

public RelayCommand(Action<object> execute, Predicate<object> canExecute)
{
    if (execute == null) throw new ArgumentException("execute");
    _execute = execute;
    _canExecute = canExecute;
}
#endregion // Constructors
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-03 09:17:47

尝尝这个

代码语言:javascript
复制
AddQuestionCommand = new RelayCommand(o =>
{
        var title = this.Items.OfType<MyTitleModel>().LastOrDefault();
        Items.Add(new MyQuestionModel() { Title = title });
 },(p)=>Items.Any()); 

第一个参数应该是Action,第二个是返回Bool的Func。而在您的上述代码中,则相反。

更新

代码语言:javascript
复制
AddTitleCommand = new RelayCommand( o => Items.Add(new MyTitleModel()),p => true));

更新

代码语言:javascript
复制
RelayCommand _myCommand;
public ICommand MyCommand
{
get
{
    if (_myCommand == null)
    {
        _myCommand = new RelayCommand(DoMyCommand,CanDoMyCommand);
    }
    return _myCommand;
}
}

bool CanDoMyCommand(object obj)
    {
        return true;//return true or false accordingly.
    }

    void DoMyCommand(object obj)
    { 
        //Do your work that you want to do on when Command Fires
    }
票数 2
EN

Stack Overflow用户

发布于 2014-01-03 09:21:51

试试relayCommand的这个实现

公共类RelayCommand : ICommand { #region字段

代码语言:javascript
复制
    private readonly Action<object> _execute;
    private readonly Predicate<object> _canExecute;

    #endregion // Fields

    #region Constructors

    public RelayCommand(Action<object> execute)
        : this(execute, null)
    {
    }

    public RelayCommand(Action<object> execute, Predicate<object> canExecute)
    {
        if (execute == null) throw new ArgumentNullException("execute");
        _execute = execute;
        _canExecute = canExecute;
    }

    #endregion // Constructors

    #region ICommand Members [DebuggerStepThrough]

    public bool CanExecute(object parameter)
    {
        return _canExecute == null || _canExecute(parameter);
    }

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

    public void Execute(object parameter)
    {
        _execute(parameter);
    }

    #endregion // ICommand Members }
}

用法

代码语言:javascript
复制
private RelayCommand _saveCommand;

 public ICommand SaveCommand
        {
            get { return _saveCommand ?? (_saveCommand = new RelayCommand(p => Save(), p => CanSave())); }
        }


    private void Save()
    {

     // Saving code


    }

私有bool CanSave() { // }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20900158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档