如何通过视图模型将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 ;
        }
    }

这一切都工作,我对架构很满意,但是…我有很多这样的函数。它们大致都做同样的事情——将命令公开为公共属性,检查私有命令是否已经存在,如果已经存在,则使用它,否则创建一个新命令。这对我来说有点"样板"。

我想要一个很好的抽象方式。我可以创建一个方法,根据某种命令映射中的标识符查找命令。我可以在视图模型构造函数中创建我的所有命令(而不是懒惰地这样做)。

你认为最佳实践是什么?我是否应该避免在每个视图模型中实例化一个新命令,并有一个中央命令查找?

如何通过视图模型将Command类公开给XAML视图

我可以在视图模型构造函数中创建我所有的命令(而不是懒惰地这样做)。

我经常这样做。在大多数实现中,命令的成本相当低。根据您的实现,它可能只是一个带有单个委托引用(或一对委托引用)的小类。在我看来,这种开销不太可能大到足以保证使用惰性构造。

我经常这样写:

// 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不同的事件。