Как получить текущий элемент в сетке данных WPF и как с ним что-то сделать?

Некоторое время назад я начал изучать паттерн MVVM с этим уроком. Я использую MicroMvvm.

У меня есть проект WPF с моделью EntityFramework. Я написал ViewModels и XAML-представления. Я хочу отобразить мои данные в DataGrid.(2 столбца с данными и 2 столбца кнопки: Редактировать, Удалить)

<DataGrid Height="250" ItemsSource="{Binding Books}" AutoGenerateColumns="False" >
    <DataGrid.Resources>
        <DataTemplate x:Key="DeleteTemplate" >
            <Button x:Name="DeleteButton" Command="{Binding DeleteBook, Mode=OneWay}" CommandParameter="{Binding}" >Delete</Button>
        </DataTemplate>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Title}"  Header="Book"/>
        <DataGridTextColumn Binding="{Binding Author}"  Header="Author"/>
        <DataGridTemplateColumn  CellTemplate="{StaticResource EditTemplate}" Header="Редактировать"/>
        <DataGridTemplateColumn  CellTemplate="{StaticResource DeleteTemplate}" Header="Удалить"/>
    </DataGrid.Columns>
</DataGrid>

В моем LibraryViewModel.cs

#region Commands
void DeleteBookExecute()
{
    if (_books == null)
        return;

    //MessageBox.Show("This is delete button. Delete item id:" myMysticalObjectFromCommandParameter );
}
bool CanDeleteBookExecute()
{
    return true;
}
public ICommand DeleteBook
{
    get
    {
        return new RelayCommand(DeleteBookExecute, CanDeleteBookExecute);
    }
}

Когда я нажимаю кнопки (удалить / редактировать), я хочу удалить / редактировать текущий объект. Я не знаю, как это сделать в MVVM.

Могу ли я сделать это с Command="{Binding DeleteBook, Mode=OneWay}" CommandParameter="{Binding}"?

Если это правильно, как я могу получить данные от CommandParameter в моей LibraryViewModel?

2 ответа

Решение

Как говорит DHN, ваши методы выполнения команд DeleteBookExecute(), CanDeleteBookExecute() должен иметь параметр типа объекта.

Ваши идеи указывают в правильном направлении. Попробуй это:

<DataGrid Name="LibraryGrid"
          Height="250" 
          ItemsSource="{Binding Books}" 
          AutoGenerateColumns="False" >

а также

Command="{Binding DataContext.DeleteBook, ElementName=LibraryGrid}" CommandParameter="{Binding}"

Использование ElementName с DataContext.DeleteBook получает команду CommandViewModel.

Мне немного любопытно, что ваши командные методы не имеют параметров. Я ожидаю, что они будут выглядеть так

void DoSomething(object param) {}
bool CanDoSomething(object param) {}

Тем не менее, я бы связал SelectedItem собственность DataGrid в собственность на ВМ. Для получения дополнительной информации, пожалуйста, посмотрите здесь.

<DataGrid ItemsSource={Binding Books} SelectedItem={Binding SelectedBook} />

Таким образом, вы можете легко получить доступ к "текущему" пункту в ваших командах.

Надеюсь это немного поможет.

Другие вопросы по тегам