gpt4 book ai didi

c# - 当我使用 Caliburn Micro 时如何将 wpf 网格上的按钮绑定(bind)到 MVVM 上的方法

转载 作者:太空狗 更新时间:2023-10-29 21:13:11 31 4
gpt4 key购买 nike

我在 wpf 窗口上有一个网格,我想添加用户可以通过单击删除按钮删除某些项目的功能。该应用程序使用 Calibrun Micro 将 View 绑定(bind)到 ViewModel。

我的问题?

1- 在 WPF 中使用按钮从网格中删除项目是个好主意吗?

2- 如何将按钮绑定(bind)到 VM 上的方法,并在方法中获取指向应删除的项目的指针?

编辑1

我以这种方式将按钮添加到数据网格:

<DataGridTemplateColumn Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="Delete" cal:Message.Attach="DeleteFromList($dataContext)" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

C# 代码如下:

 public void DeleteFromList(object tmp)
{

}

但是 datagrid 上的按钮被禁用并且单击它们不会触发 DeleteFromList 方法(我使用调试器检查过)。

为什么他们被禁用了?如何启用它们?

最佳答案

这取决于您的按钮的放置方式 - 是否有一个“删除”按钮,或者您是否在网格中每行添加了一个按钮(我们是在谈论 DataGrid 还是只是 Grid?)

假设您正在谈论 DataGrid,您可以轻松地向按钮添加一个 Action 消息命令,并将正在删除的项目传递给 VM 上的消息处理程序

例如在虚拟机中

public class MyViewModel
{
public DataItemCollectionTypeName ItemCollection { get; set; }

public void DeleteItem(DataItemTypeName item)
{
ItemCollection.Remove(item);
}
}

假设 ItemCollection 绑定(bind)到网格,按钮 XAML 可能如下所示:

<Button cal:Message.Attach="[Click] = [DeleteItem($datacontext)]" />

如果这是模板行,您可能还需要设置 Action.TargetWithoutContext(它应该绑定(bind)到 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 派生控件的情况下,每个项目的数据上下文指向被绑定(bind)的项目,而不是 ViewModel。

为了向 CM 提示它应该尝试解析哪个对象的 DeleteItem 方法,您可以使用 Action.TargetWithoutContext 附加属性,它适用不更改绑定(bind)行/项的 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>

那应该可以了!

关于c# - 当我使用 Caliburn Micro 时如何将 wpf 网格上的按钮绑定(bind)到 MVVM 上的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18980365/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com