如何在数据网格模板中有一个按钮,在单击时将删除该项目

时间:2011-07-08 14:10:43

标签: wpf mvvm datagrid

我想为我的datagrid列使用datatemplate,并为每个项目都有一个按钮。如果用户点击按钮,我希望删除该项目。我正在使用MVVM模式。我该如何做到这一点?

<DataGridTemplateColumn>
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <Button Width="50" Content="Remove" Command="{Binding RemoveItemCommand}"/>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

3 个答案:

答案 0 :(得分:4)

View负责此事。您可以简单地使用代码隐藏来控制UI元素的可见性,以响应UI中的用户操作。

有时,实际上要比严格教条更好。


好吧,既然你已经编辑了你的问题,那就完全不同了。

您的DataGrid应绑定到一组项目。

您的按钮应绑定到ViewModel上的命令,CommandParameter应该是特定行绑定的模型。

<DataTemplate>
      <Button Content="Remove" 
              Command="{Binding DataContext.RemoveItemCommand, 
                                ElementName=theWindow}"
              CommandParameter="{Binding}" />
</DataTemplate>

请注意这里的一些重要事项。我们需要在模板中绑定到ViewModel上的ICommand。 ViewModel是Window的 DataContext 。在此示例中,窗口名为“theWindow”(x:Name="theWindow")。由于 Binding 的来源是窗口,因此Path必须指向该窗口上 DataContext 属性中的ViewModel。

我们将当前Model的DataGrid行绑定到命令中。这样,从ViewModel中的集合中删除它就是一种琐事。

public ObservableCollection<Model> Items {get;set;}

public ICommand RemoveItemCommand {get;set;}

// this method is called when RemoveItemCommand.Execute is called!
public void Execute(object parameter)
{
  Items.Remove(parameter as Model);
}

这假设您正在使用其中一个标准的委托ICommand实现。您可以看到这是多么微不足道的实现,并且由于集合是一个可观察的集合,一旦您单击该按钮并删除了模型,DataGrid将被通知集合中的更改并删除该行。

答案 1 :(得分:4)

public class ItemViewModel
{
  public ItemViewModel()
  {
    RemoveCommand = new MyCommand(Remove);
  }

  public event EventHandler ItemRemoved;
  public ICommand RemoveCommand { get; private set; }

  private void Remove()
  {
    // Whatever it takes to remove item from your data store
    service.Remove(this.Data);

    var removeItem = ItemRemoved;
    if (removeItem != null)
      removeItem(this, EventArgs.Empty);
  }
}

public class ListViewModel
{
  public ListViewModel(IEnumerable<ItemViewModel> items)
  {
    ItemVMs=new ObservableCollection<ItemViewModel>(items);
    foreach (var item in ItemVMs)
      item.ItemRemoved += RemoveSelectedItem;
  }

  public ObservableCollection<ItemViewModel> ItemVMs { get; private set; }

  private void RemoveSelectedItem(object sender, EventArgs e)
  {
    var item = sender as ItemViewModel;
    item.ItemRemoved -= RemoveSelectedItem;
    ItemVMs.Remove(item);
  }
}

每个项目的RemoveCommand都将绑定到DataGrid中的按钮。听起来你已经完成了那部分。使ListViewModel的ItemVMs属性成为DataGrid的数据源。

答案 2 :(得分:2)

您可能最好在按钮的Click事件上使用标准路由事件而不是命令。 click事件将允许您检索有关单击控件的信息,然后您还可以轻松检索按钮的父级,以删除该项。