这取决于您的按钮的放置方式 - 是否有一个“删除”按钮,或者您是否在网格中的每行添加了一个按钮(我们是在说话DataGrid
还是只是Grid
?)
假设您正在谈论DataGrid
,您可以轻松地将操作消息命令添加到按钮并将正在删除的项目传递给 VM 上的消息处理程序
例如在虚拟机中
public class MyViewModel
{
public DataItemCollectionTypeName ItemCollection { get; set; }
public void DeleteItem(DataItemTypeName item)
{
ItemCollection.Remove(item);
}
}
假设ItemCollection
绑定到网格,按钮 XAML 可能如下所示:
<Button cal:Message.Attach="[Click] = [DeleteItem($datacontext)]" />
如果这是一个模板行,您可能还需要设置Action.TargetWithoutContext
(它应该绑定到 VM),否则 CM 将无法找到 VM 以调用其上的操作消息
如果您有一个不包含在网格中的按钮,您始终可以SelectedItem
在操作消息中定位网格
<DataGrid x:Name="SomeDataGrid"></DataGrid>
<Button cal:Message.Attach="[Click] = [DeleteItem(SomeDataGrid.SelectedItem)]" />
它可能是(也可能是)CM 将查看的默认属性,因此您可能不需要指定属性名称,除非您修改了默认约定
<DataGrid x:Name="SomeDataGrid"></DataGrid>
<Button cal:Message.Attach="[Click] = [DeleteItem(SomeDataGrid)]" />
编辑
澄清:为了让CM找到一个VM来调用DeleteItem
它使用DataContext
当前项目的方法。在ItemsControl
派生控件的情况下,每个项目的数据上下文都指向被绑定的项目,而不是 ViewModel。
为了给 CM 提示它应该尝试在哪个对象上解析该DeleteItem
方法,您可以使用Action.TargetWithoutContext
附加属性,该属性将目标对象应用于操作消息而不更改DataContext
绑定行/项目的
您可以使用元素名称语法来指向正确的位置:
在此示例中,我使用网格作为根元素并将其命名为,然后使用语法将LayoutRoot
操作消息目标指向LayoutRoot.DataContext
(将是 ViewModel) 。ElementName
您可以使用任何方法(AncestorType
或其他)
<Grid x:Name="LayoutRoot">
<DataGridTemplateColumn Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="Delete" cal:Message.Attach="DeleteFromList($dataContext)" cal:Action.TargetWithoutContext="{Binding DataContext, ElementName=LayoutRoot}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</Grid>
那应该可以工作!