如何在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
}
}
答案 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);
}