Как иметь кнопку в шаблоне сетки данных, которая удалит элемент при нажатии - PullRequest
6 голосов
/ 08 июля 2011

Я хотел бы использовать табличку с данными для моих столбцов таблицы данных и иметь кнопку для каждого элемента.Я хотел бы удалить элемент, если пользователь нажмет кнопку.Я использую шаблон MVVM.Как мне это сделать?

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

Ответы [ 3 ]

4 голосов
/ 08 июля 2011
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. Похоже, вы уже сделали эту часть. Сделайте свойство ItemVMs ListViewModel источником данных для вашей DataGrid.

4 голосов
/ 08 июля 2011

За это отвечает View. Вы можете просто использовать codebehind для управления видимостью элементов пользовательского интерфейса в ответ на действия пользователя в пользовательском интерфейсе.

Иногда лучше быть практичным, чем жестко догматичным.


Ну, теперь, когда вы отредактировали свой вопрос, он становится совершенно другим вопросом.

Ваш DataGrid должен быть привязан к коллекции элементов.

Ваша кнопка должна быть привязана к команде в ViewModel, а CommandParameter должен быть моделью, с которой связана конкретная строка.

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

Обратите внимание на некоторые важные вещи здесь. Нам нужно из шаблона связать ICommand в ViewModel. ViewModel - это DataContext окна. В этом примере окно называется «theWindow» (x:Name="theWindow"). Поскольку источником Binding является окно, путь должен указывать на ViewModel в свойстве DataContext этого окна.

Мы передаем текущую модель, с которой связана строка 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 будет уведомлен об изменении в коллекции и удалит эту строку.

2 голосов
/ 08 июля 2011

Возможно, вам лучше использовать стандартные перенаправленные события для события Click кнопки вместо команды. Событие click позволит вам получить информацию о том, какой элемент управления был нажат, а затем вы также можете легко получить родительский элемент кнопки, чтобы удалить этот элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...