首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在MVVM Light框架中使用RelayCommand

如何在MVVM Light框架中使用RelayCommand
EN

Stack Overflow用户
提问于 2011-07-20 05:56:41
回答 2查看 55.9K关注 0票数 22

我刚刚开始学习MVVM Light框架,我找不到任何关于如何使用RelayCommand的简单示例。为了学习的目的,我只是想在我的视图中有一个按钮,当单击它时,会显示一个hello world消息框,并且每隔一分钟(基本上如果DateTime.Now.Minute %2 == 0)就会启用该按钮。

按钮XAML看起来是什么样子,RelayCommand HelloWorld在ViewModel中是如何定义的?

谢谢你的帮助!!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-20 06:12:49

RelayCommand的目的是实现按钮控件所需的ICommand接口,并将调用传递给ViewModel中通常紧挨着它们的某个其他函数。

因此,例如,您将拥有一个如下所示的ViewModel类:

代码语言:javascript
复制
class HelloWorldViewModel : ViewModelBase
{
    public RelayCommand DisplayMessageCommand { get; private set; }

    private DispatchTimer _timer;

    public HelloWorldViewModel()
    {
        this.DisplayMessageCommand = new RelayCommand(this.DisplayMessage, CanDisplayMessage);

        // Create a timer to go off once a minute to call RaiseCanExecuteChanged
        _timer = new DispatchTimer();
        _timer = dispatcherTimer.Tick += OnTimerTick;
        _timer.Interval = new Timespan(0, 1, 0);
        _timer.Start();
    }

    private void OnTimerTick(object sender, EventArgs e)
    {
        this.DisplayMessageCommand.RaiseCanExecuteChanged();
    }

    public bool CanDisplayMessage()
    {
        return DateTime.Now.Minute % 2 == 0;
    }

    public void DisplayMessage()
    {
        //TODO: Do code here to display your message to the user
    }
}

在控件中,您可以在后台代码中或直接通过DataContext={StaticResource ...}在XAML中设置DataContext

然后,您的按钮将绑定到ViewModel中的命令,如下所示

代码语言:javascript
复制
<Button Content='Push me' Command='{Binding DisplayMessageCommand}' />

当按钮被单击时,它使用DisplayMessageCommand并在这个对象上调用Execute()RelayCommand只是将该对象转发到DisplayMessage方法。

DispatchTimer每分钟触发一次并调用RaiseCanExecuteChanged()。这允许绑定到该命令的按钮重新检查该命令是否仍然有效。否则,您可能会单击该按钮,但发现该命令当前不可用。

票数 47
EN

Stack Overflow用户

发布于 2014-09-03 14:31:28

或者使用lambda

代码语言:javascript
复制
    private RelayCommand<anyobject> _AddCmd;
    public ICommand AddPoint
    {
        get
        {
            return _AddCmd ??
                (
                _AddCmd = new RelayCommand
                    (
                        (obj) =>
                        {
                            ViewModelWF.ZeroPoints.Add(new WM.Point(0, 0));
                        }
                    )
                );
        }
    }

    private RelayCommand _DeleteCmd;
    public ICommand DeletePoint
    {
        get
        {
            return _DeleteCmd ??
                (
                _DeleteCmd = new RelayCommand
                    (
                        () =>
                        {
                            int idx = wpfZeroPoints.SelectedIndex;
                        },
                        () =>
                        {
                            return wpfZeroPoints.SelectedIndex <= 0;
                        }
                    )
                );
        }
    }
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6754630

复制
相关文章

相似问题

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