如何通过视图模型将Command类公开给XAML视图
本文关键字:视图 XAML Command 何通过 模型 | 更新日期: 2023-09-27 18:18:47
我有一个简单的MVVM架构,其中我使用视图模型将命令绑定到xaml视图。我的命令是相当通用的,我将把它们绑定到几个视图,所以我把它们放在它们自己的类中实现ICommand
接口。在视图模型内部,我有这样的公共访问器:
private ICommand _myCommand;
public ICommand MyCommand
{
get
{
if (_myCommand == null)
{
_myCommand = new MyCommand(_injectedModel);
}
return _myCommand ;
}
}
这一切都工作,我对架构很满意,但是…我有很多这样的函数。它们大致都做同样的事情——将命令公开为公共属性,检查私有命令是否已经存在,如果已经存在,则使用它,否则创建一个新命令。这对我来说有点"样板"。
我想要一个很好的抽象方式。我可以创建一个方法,根据某种命令映射中的标识符查找命令。我可以在视图模型构造函数中创建我的所有命令(而不是懒惰地这样做)。
你认为最佳实践是什么?我是否应该避免在每个视图模型中实例化一个新命令,并有一个中央命令查找?
我可以在视图模型构造函数中创建我所有的命令(而不是懒惰地这样做)。
我经常这样做。在大多数实现中,命令的成本相当低。根据您的实现,它可能只是一个带有单个委托引用(或一对委托引用)的小类。在我看来,这种开销不太可能大到足以保证使用惰性构造。
我经常这样写:
// Constructor
public MyViewModel()
{
this._injectedModel = SetModel();
this.MyCommand = new MyCommand(_injectedModel);
}
ICommand MyCommand { get; private set; }
你好像在找Caliburn.Micro。它将ViewModel方法映射到XAML中的x:Name。
您将不再需要命令的"样板"代码。
的例子:
<Button x:Name="Save" />
将调用:
public void Save()
{
//Save logic
}
打开按钮。
请注意,在任何时候我都没有做任何命令,它都是在后台完成的。
这是一个非常简单的例子,您可以为调用添加参数,并使其使用与Click不同的事件。