【问题标题】:How to get current element in WPF datagrid and how to do something with it?如何获取 WPF 数据网格中的当前元素以及如何处理它?
【发布时间】:2013-02-23 20:55:14
【问题描述】:

前段时间我开始用这个tutorial研究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}" 做吗?

如果正确,我如何在 LibraryViewModel 中从 CommandParameter 获取数据?

【问题讨论】:

    标签: wpf data-binding mvvm icommand commandparameter


    【解决方案1】:

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

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

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

    和

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

    将ElementName 与DataContext.DeleteBook 结合使用可以获得LibraryViewModel 的命令。

    【讨论】:

    • 我不明白如何在 LibraryViewModel.cs 中获取此对象:void DeleteBookExecute() {?}。用那种方式重写这个方法? void DeleteBookExecute(object param) 和 param 会有我的行对象吗?还是不...
    • @chromigo:应该是这样,是的。参数由 WPF 魔术自动传递...
    • 感谢您的帮助。当我更改 MicroMvvm 方法(如 DHN 所说,采用 1 个参数)时,一切都起作用了。
    【解决方案2】:

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

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

    不过,我会将DataGrid 的SelectedItem 属性绑定到VM 上的一个属性。如需更多信息,请查看here。

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

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多