如何通过View Models将Command类公开给XAML视图

时间:2011-12-23 19:24:13

标签: c# wpf mvvm

我有一个简单的MVVM架构,我使用视图模型将命令绑定到xaml视图。我的命令相当通用,我将它们绑定到几个视图,所以我把它们放到他们自己的实现ICommand接口的类中。在视图模型中,我有这样的公共访问器:

    private ICommand _myCommand;
    public ICommand MyCommand
    {
        get
        {
            if (_myCommand == null)
            {
                _myCommand = new MyCommand(_injectedModel);
            }

            return _myCommand ;
        }
    }

这一切都有效,我对这个架构很满意但是...我有很多这些功能。它们大致都做同样的事情 - 将命令公开为公共属性,检查私有命令是否已经存在,如果是,则使用它,否则创建一个新命令。根据我的口味,它有点“样板”。

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

您认为最佳做法是什么?我应该避免在每个视图模型中实例化一个新命令并进行中央命令查找吗?

2 个答案:

答案 0 :(得分:1)

  

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

我经常这样做。在大多数实现中,命令的成本相当便宜。根据您的实现,它可能只是一个具有单个委托引用(或一对委托引用)的小类。对于IMO来说,这不太可能是一个足够大的开销,以保证懒惰的构造。

我经常把它写成:

// Constructor
public MyViewModel()
{
    this._injectedModel = SetModel();

    this.MyCommand = new MyCommand(_injectedModel); 
}

ICommand MyCommand { get; private set; }

答案 1 :(得分:0)

您似乎在寻找Caliburn.Micro。它将ViewModel方法映射到XAML中的x:Name 您将不再需要命令的“样板”代码。

示例:

<Button x:Name="Save" />

将致电:

public void Save()
{
   //Save logic
}

点击按钮。
请注意,在任何时候我都没有发出任何命令,所有这些都是在幕后完成的。

这是一个非常简单的示例,您可以在调用中添加参数,并使其使用与Click不同的事件。