2

前段时间我开始通过这个教程学习 MVVM 模式。我使用 MicroMvvm。

我有一个带有 EntityFramework 模型的 WPF 项目。我编写了 ViewModel 和 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}"吗?

如果正确,如何从CommandParameterLibraryViewModel 中获取数据?

4

2 回答 2

2

我有点好奇你的命令方法没有参数。我希望他们看起来像这样

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

不过,我会将 的SelectedItem属性绑定DataGrid到 VM 上的属性。有关更多信息,请查看此处

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

因此,您可以轻松访问命令中的“当前”项目。

希望这个对你有帮助。

于 2013-03-08T10:54:57.677 回答
2

正如 DHN 所说,您的命令执行方法DeleteBookExecute()应该CanDeleteBookExecute()有一个 object 类型的参数。

你的想法指向正确的方向。试试这个:

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

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

使用ElementNamewithDataContext.DeleteBook可以获得 LibraryViewModel 的命令。

于 2013-03-08T11:54:29.153 回答