MVVM ICommand绑定“更高”

时间:2016-01-18 06:24:03

标签: c# mvvm data-binding uwp icommand

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

我有一个View,其ViewModel几乎只是 ShoppingCart ,而 ShoppingCart 主要是产品的列表。

现在,我的视图显示 GridView 中的产品,它使用DataTemplate显示名称 Price < / em>,以及每个产品的“删除”按钮。问题是,由于数据绑定,如果我尝试将“删除”按钮的 Command 属性数据绑定到我的ViewModel中的 RemoveCommand 属性,则代码会失败,因为它会查找 产品类中的RemoveCommand ,而不是 ViewModel 类。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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

所以我希望gridview作为datacontext的类持有这个RemoveCommand命令。或者在AncestorType中放置具有此类datacontext的控件,该控件包含RemoveCommand命令。

这是你可以保持封装和绑定也能正常工作。