绑定到数据网格中的命令

Ada*_*ney 18 .net data-binding wpf mvvm

我在WPF应用程序中使用MV-VM模式.我将ViewModel绑定到ContentControl并使用窗口资源中定义的数据模板来呈现该ViewModel的视图(UserControl).

在ViewModel中,我有一组项目.我将该集合绑定到WPF工具包中提供的数据网格.同样在视图模型中,我定义了一个RemoveItem命令,该命令接受要删除的项ID的参数.

如何在数据网格中绑定该命令?网格的数据上下文就是那个集合,所以类似于:

<Button Command="{Binding Path=RemoveCommand}" CommandParameter="{Binding Path=id}">X</Button>
Run Code Online (Sandbox Code Playgroud)

不起作用 - 它找不到命令.我想我需要做RelativeSource绑定,但那会是什么样子?Ancestor类型是UserControl还是ContentControl?我的ViewModel作为DataContext驻留在哪里?

还是我离开这里?

Ken*_*art 38

是的,你只需要升级一级.我会尝试ElementName先绑定并RelativeSource仅在必要时使用.例如,我更喜欢这个:

<DataGrid x:Name="_grid">
    ...
        <Button Command="{Binding DataContext.RemoveItem, ElementName=_grid}"/>
    ...
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

也就是说,当涉及到元素名称和控件的作用域时,XAML编译器可以得到一个结,所以你可能需要诉诸RelativeSource:

<DataGrid x:Name="_grid">
    ...
  <Button Command="{Binding DataContext.RemoveItem, 
                    RelativeSource={RelativeSource FindAncestor, 
                                    AncestorType={x:Type DataGrid}}
                   }"/>
    ...
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

您只需要搜索,直到数据上下文成为您的视图模型.UserControl如果你愿意,你可以搜索一个- 不确定它真的很重要.两者都是非常脆弱的绑定,这就是我更喜欢这种ElementName方法的原因.