Как получить текущий элемент в сетке данных 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} />
Таким образом, вы можете легко получить доступ к "текущему" пункту в ваших командах.
Надеюсь это немного поможет.