【问题标题】:How to bind delete action (in WPF Datagrid) to a command or property in view model如何将删除操作(在 WPF Datagrid 中)绑定到视图模型中的命令或属性
【发布时间】:2012-03-13 20:09:57
【问题描述】:

我有一个数据网格和一个视图模型,其中有一个“Person”类的 Observable 集合,用作数据网格的 ItemSource。

Datagrid 有两个文本列“FirstName”和“LastName”

数据网格将“CanUserAddRows”和“CanUserDeleteRows”设置为 true。因此用户可以使用删除按钮添加和删除新行。

当用户尝试删除一行时,我想验证他是否可以删除该行。如果他可以删除它,它将被删除,否则将显示错误并且无法删除该行。类似于我们在中继命令中的内容

New RelayCommand(parm => this.DeletePerson(parm),this.CanDeletePerson(parm)

这可能吗?如果有怎么办?

  • 吉里哈

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    将属性绑定到 CanUserDeleteRows。

    XAML:

    CanUserDeleteRows="{Binding UserCanDelete}"
    

    视图模型:

        public bool UserCanDelete
        {
            get
            {
                // return a value based on the currently selected item and business rules
            }
        }
    

    确保您在某处为此属性引发了 PropertyChanged 事件,您在哪里执行此操作将取决于影响您的返回值的其他数据更改。

    【讨论】:

      【解决方案2】:

      尝试将您的 DataGrid 设置为 ...

      CanUserDeleteRows="False" SelectedItem="{Binding SelectedPerson, Mode=TwoWay}"

      并添加...

      <DataGrid.InputBindings>
          <KeyBinding Key="Delete" Command="{Binding DeletePersonCommand}" />
      </DataGrid.InputBindings>
      

      将 SelectedPerson 添加到您的 VM 并根据 DeletePersonCommand (ICommand) Execute 或 CanExecute 中的 SelectedPerson 执行删除验证,如果验证通过,则从 ObservableCollection 中删除该项目。

      【讨论】:

      • 值得注意的是,即使 CanUserDelete rows 为 false,网格也会吃掉删除键,因此您不能将键绑定放在包装元素中。
      • 哇,这真是完美的解决方案,在我将密钥绑定到我的视图模型中的自定义命令后,它可以完美运行并避免代码落后。我见过其他解决方案,但到目前为止,这个是最好的!
      • 如果您不想要额外的绑定,您也可以将所选项目作为命令参数传递:&lt;KeyBinding Key="Delete" Command="{Binding DeletePersonCommand}" CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/&gt;
      • 为什么需要设置 CanUserDeleteRows="False" ?
      • 如果为真,DataGrid 将删除不执行验证的行。通过设置为 False,VM 将处理从集合中删除项目(如果它通过验证)
      猜你喜欢
      • 2014-08-13
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多