我有一个基本的viewModel和两个派生的viewModel。在我的基本viewModel中,我有一些命令CloseCommand,CancelCommand等。
我的视图附加到其中一个派生的viewModel。我需要将一个按钮绑定到基本viewModel中的CloseCommand。 我如何通过继承来做到这一点?
我将按钮的内容与基本viewModel中的字符串属性绑定,并且其工作正常但是如何绑定命令?
答案 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)
没什么特别的,这就是你需要做的事情: