从View绑定到base viewmodel命令

时间:2012-10-12 01:07:33

标签: silverlight mvvm binding command viewmodel

我有一个基本的viewModel和两个派生的viewModel。在我的基本viewModel中,我有一些命令CloseCommand,CancelCommand等。

我的视图附加到其中一个派生的viewModel。我需要将一个按钮绑定到基本viewModel中的CloseCommand。 我如何通过继承来做到这一点?

我将按钮的内容与基本viewModel中的字符串属性绑定,并且其工作正常但是如何绑定命令?

2 个答案:

答案 0 :(得分:1)

只要将这些命令公开为ViewModel的公共属性,就没有什么特别需要绑定的命令。我有同样的情况,所以这是我非常自己实现的方式。

首先在基类中定义类型为ICommand的OKCommand / CancelCommand。至于es Execute和CanExecute方法,我将它们定义为受保护的虚拟方法(顺便说一句,你也可以将你的命令定义为虚拟。这将使你能够编写XAML样式,将按钮的可见性模式设置为折叠,如果它命令值为空)。在派生的ViewModels中你只需要根据需要覆盖命令,Execute和CanExecute方法,但是从你的视图来看,你总是直接绑定到命令名。

下面的

是我刚才向你解释的一个例子。

public abstract class ViewModelbase
{
    private DelegateCommand _okCommand;
    public virtual DelegateCommand OkCommand
    {
        get { return _okCommand ?? (_okCommand = new DelegateCommand(OkExecuteCommand, CanOkExecute)); }
    }

    protected virtual void OkExecuteCommand()
    {
        DialogResult = true;
    }

    protected virtual bool CanOkExecute()
    {
        return IsValid;
    }
}

然后,您只需定义从View ViewModel类

派生的具体ViewModel类
public class SampleViewModel : ViewModelbase
{
   //If u have defined XAML style which sets viability of button as collapsed if its command value is null u simply override command
   public override DelegateCommand OkCommand { get { return null; } }
    protected override void OkExecuteCommand()
    {
        do whatever u want as this is a command execution
    }
}

在XAML部分中,如果没有Base类,只需将按钮命令绑定到Viewmodel Command即可。 这里的关键点是你应该使用public修饰符公开你的基本ViewModel类的命令(你只需要getter所以这段代码提供了一种你可以公开命令的方法的样本)

答案 1 :(得分:1)

没什么特别的,这就是你需要做的事情:

  1. 将View的DataContext设置为派生的ViewModel
  2. 确保将CloseCommand声明为ViewModelBase中的公共属性
  3. 将Button的Command属性设置为“{Binding CloseCommand}”