为datagrid中的每一行添加删除按钮

时间:2012-06-05 05:48:59

标签: .net wpf datagrid

如何在WPF中为数据网格中的每一行(包含两个字段)添加删除按钮。而datagrid itemsource是

ObservableCollection<Result>

 public class Result : INotifyPropertyChanged
{
    public string FriendlyName { get; set; }
    public string Id { get; set; }

    public Result(string name, string id)
    {
        this.FriendlyName = name;
        this.Id = id;
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    void OnPropertyChanged(string property)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

    #endregion
}

}

1 个答案:

答案 0 :(得分:24)

您可以添加DataGridTemplateColumn并向其Button添加CellTemplate。然后使用内置的ApplicationCommands.Delete或您自己的ICommand作为Button

<DataGrid ItemsSource="{Binding Results}"
          AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="FriendlyName"
                            Binding="{Binding FriendlyName}"/>
        <DataGridTextColumn Header="Id"
                            Binding="{Binding Id}"/>
        <DataGridTemplateColumn Header="Delete">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Content="Delete"
                            Command="Delete"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

<强>更新
如果您不想使用内置Delete,则可以使用自己的ICommand。以下是RelayCommand的简短示例,可在以下链接中找到:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx。另外,我在此处上传了它:RelayCommand.cs

<DataGrid ItemsSource="{Binding Results}"
          SelectedItem="{Binding SelectedResult}"
          AutoGenerateColumns="False">
    <DataGrid.Columns>
        <!-- ... -->
        <DataGridTemplateColumn Header="Delete">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Content="Delete"
                            Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}},
                                              Path=DataContext.DeleteCommand}"
                            CommandParameter="{Binding}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

在你的viewmodel或代码背后

private Result m_selectedResult;
public Result SelectedResult
{
    get { return m_selectedResult;}
    set
    {
        m_selectedResult = value;                
        OnPropertyChanged("SelectedResult");
    }
}

private bool CanDelete
{
    get { return SelectedResult != null; }
}

private ICommand m_deleteCommand;
public ICommand DeleteCommand
{
    get
    {
        if (m_deleteCommand == null)
        {
            m_deleteCommand = new RelayCommand(param => Delete((Result)param), param => CanDelete);
        }
        return m_deleteCommand;
    }
}

private void Delete(Result result)
{
    Results.Remove(result);
}