0

我有一个基本视图模型和两个派生的视图模型。在我的基本视图模型中,我有一些命令 CloseCommand、CancelCommand 等。

我的视图附加到派生的视图模型之一。我需要将一个按钮绑定到基本视图模型中的 CloseCommand。我怎样才能通过继承做到这一点?

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

4

2 回答 2

2

只要将这些命令公开为 ViewModel 的公共属性,您无需做任何特别的事情来绑定这些命令。我有同样的情况,所以这是我自己的实现方式。

首先在您的基类中定义 ICommand 类型的 OKCommand / CancelCommand。就 Execute 和 CanExecute 方法而言,我将它们定义为受保护的虚拟方法(顺便说一下,您还可以将命令定义为虚拟。这将使您能够编写 XAML 样式,将按钮的可见性模式设置为折叠,如果它命令值为空)。在派生的 ViewModel 中,您只需根据需要覆盖命令、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;
    }
}

然后你只需定义从基本 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 部分中,您不必做任何特别的事情,只需将您的按钮命令绑定到 Viewmodel 命令,就像没有基类时所做的那样。 这里的关键点是您应该使用 public 修饰符从基本 ViewModel 类中公开命令(您只需要 getter,因此此代码提供了您可以公开命令的一种方式的示例)

于 2012-10-12T01:51:37.840 回答
1

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

  1. 将 View 的 DataContext 设置为派生的 ViewModel
  2. 例如,确保将 CloseCommand 声明为 ViewModelBase 中的公共属性
  3. 将 Button 的 Command 属性设置为“{Binding CloseCommand}”
于 2012-10-12T04:36:52.840 回答