【问题标题】:Using Commands in WPF using the MVVM pattern使用 MVVM 模式在 WPF 中使用命令
【发布时间】:2016-05-03 02:01:43
【问题描述】:

我遇到了其他开发人员可能知道的问题,我正在努力解决它并很好地理解它。它不必直接连接到 MVVM/WPF,也可以连接到 MVC 和 MVP 等其他方法。

假设我有一个购物车模型,它有自己的 Service、addItem 和 deleteItem 方法并计算购物车的价格等。

现在在我的视图中显示这个购物车,当我想显示购物车的总和时,我点击一个按钮来触发处理这个问题的方法。

问题来了:如何将方法(或命令)绑定到按钮?我知道我必须使用ICommand,但是通过使用这个接口,我有点打破了职责分离的规则。如何在不违反 MVVM 模式规则的情况下实现。

【问题讨论】:

  • 你将在VIew的ViewModel中实现它
  • 在 ViewModel 中使用 ICommand 并不违反 MVVM 模式,因为命令是一个表示问题,因此属于 ViewModel。 @Domysee 已经指出了这一点,在命令中您只需将其中继到服务层。请记住,您可能会发出通知或将新价格设置为确实会发出通知的属性

标签: c# wpf model-view-controller mvvm command


【解决方案1】:

你所说的PresentationModel,就是WPF中的ViewModel,也就是View的DataContext
这个 ViewModel 包含一个 ShopCart 的实例。它还保存命令,以便视图可以绑定到它们。
该命令,我们将其命名为CalculatePrice 应该只调用ShopCartcalculatePrice() 方法。

问题是,你如何定义它:
好吧,我喜欢使用RelayCommand,它允许您使用 lambda 表达式定义命令。

那么你可以拥有一个属性public RelayCommand CalculatePrice,你可以在构造函数中定义它:

public ViewModel(){
    CalculatePrice = new RelayCommand(param => this.ShopCart.calculatePrice());
}

这样,您可以将CalculatePrice 命令绑定到按钮,然后执行ShopCart.calculatePrice()

【讨论】:

    【解决方案2】:

    如果我理解正确,在您看来,您会显示一组 ShopCart,并且您希望能够调用 ShopCart.calculatePrice() 方法。我想说,您需要做的是将 ICommand 对象存储在您的 ViewModel 中,并将 ShopCart 绑定到 CommandParameter 属性。这样,您将收到 ShopCart 作为 CanExecuteExecute 方法的参数。

    【讨论】:

      猜你喜欢
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 2017-12-06
      • 2011-12-05
      • 2011-11-25
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多