MVVM ICommand 绑定 "higher up"

MVVM ICommand Binding "higher up"

我正在开发类似购物车的应用程序,以此作为实践 MVVM 设计模式的一种方式。

我有一个 View,其 ViewModel 几乎只是一个 ShoppingCart,而 ShoppingCart 主要是 产品s.

现在,我的视图在 GridView 中显示 Products,它使用 DataTemplate 显示 Name 价格,以及每个 产品 的删除按钮。问题是,由于数据绑定,如果我尝试将 Remove 按钮的 Command 属性数据绑定到我的 ViewModel 中的 RemoveCommand 属性 ,代码失败是因为它在 Product class 而不是 ViewModel 中查找 RemoveCommand ] class.

我非常怀疑我想打破封装并让 Product 处理从 ShoppingCart 中删除自身的问题,但我不能似乎找到了解决这个问题的正确方法。

为您的 GridView 命名并执行 Command="{Binding ElementName=theGridView, Path=DataContext.RemoveCommand}"。您也可以使用 RelativeSource 绑定,尽管我认为前者更快。

您还希望将产品本身传递到命令处理程序中,以便您知道用户单击了哪一个,使用 CommandParameter="{Binding Path=.}" 执行此操作。 RemoveCommand 属性 应声明为 return ICommand 类型,但应 return RelayCommand 的通用实例,即:

public ICommand RemoveCommand { get { return new RelayCommand<Product>(OnRemove); } }
private void OnRemove(Product product)
{
    // remove it here
}

使用 RelativeSource(ancestor) 绑定作为通用解决方案。

   Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type GridView}}, Path=DataContext.RemoveCommand}"

所以我希望 gridview 作为数据上下文的 class 持有此 RemoveCommand 命令。或者在 AncestorType 中放置具有此类数据上下文的控件,其中包含 RemoveCommand 命令。

这是您可以保留封装和绑定的方法。