我想为我的datagrid列使用datatemplate,并为每个项目都有一个按钮。如果用户点击按钮,我希望删除该项目。我正在使用MVVM模式。我该如何做到这一点?
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Width="50" Content="Remove" Command="{Binding RemoveItemCommand}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
答案 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事件将允许您检索有关单击控件的信息,然后您还可以轻松检索按钮的父级,以删除该项。