6

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

我的问题?

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

2-如何将按钮绑定到 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 方法(我使用调试器进行了检查)。

为什么他们被禁用?我怎样才能使它们启用?

4

2 回答 2

9

这取决于您的按钮的放置方式 - 是否有一个“删除”按钮,或者您是否在网格中的每行添加了一个按钮(我们是在说话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>

那应该可以工作!

于 2013-09-24T11:37:01.310 回答
1

你可以做这样的事情......

<Button cal:Message.Attach="[Event MouseEnter] = [Action Save($this)]"> 

检查文档,因为他们将解释您需要做什么并应该回答您的问题:链接

于 2013-09-24T11:34:43.720 回答