我有一个基本视图模型和两个派生的视图模型。在我的基本视图模型中,我有一些命令 CloseCommand、CancelCommand 等。
我的视图附加到派生的视图模型之一。我需要将一个按钮绑定到基本视图模型中的 CloseCommand。我怎样才能通过继承做到这一点?
我已将按钮的内容与基本 viewModel 中的字符串属性绑定,并且工作正常,但是如何绑定命令?
我有一个基本视图模型和两个派生的视图模型。在我的基本视图模型中,我有一些命令 CloseCommand、CancelCommand 等。
我的视图附加到派生的视图模型之一。我需要将一个按钮绑定到基本视图模型中的 CloseCommand。我怎样才能通过继承做到这一点?
我已将按钮的内容与基本 viewModel 中的字符串属性绑定,并且工作正常,但是如何绑定命令?
只要将这些命令公开为 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,因此此代码提供了您可以公开命令的一种方式的示例)
没什么特别的,这是你需要做的: