【问题标题】:How can I do CanDelete validation on ObservableCollection<T>?如何对 ObservableCollection<T> 进行 CanDelete 验证?
【发布时间】:2013-09-12 08:32:37
【问题描述】:

我通过源属性将 ObservableCollection 绑定到 xamdatagrid。

<igDP:XamDataGrid DataSource="{Binding Path=MyCollection}" />

我可以做到的一种方法是使用

_items.CollectionChanged += ItemsChanged

但这似乎为时已晚,因为项目已被删除。有什么好的解决办法吗?

更新

用户通过 xamdatagrid 手动删除项目。

谢谢

【问题讨论】:

  • 如何从收藏中删除项目?
  • 我将其保留为默认的 xamdagrid 行为,它为我执行 DisplayPromtMessage。

标签: c# wpf observablecollection xamdatagrid


【解决方案1】:

您不应该直接在 Grid 中删除行,UI 不负责执行业务操作,这应该由 ViewModel 执行,然后 ViewModel 应该进行验证。

AllowDelete="False"

在数据网格中:

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

在视图模型上,您将拥有 DeleteOrderCommand。

如果您将此视图替换为其他技术并且新控件没有删除行选项,您将使用按钮。因此,您仍然可以重用您的 ViewModel,因为按钮将绑定到 DeleteOrderCommand 或此命令调用的方法,并且您的验证在 ViewModel 中,因此当您切换到新技术中的 View 时它并没有消失。

更新: 您可以在 DeleteOrderCommand 上使用 CanExecute 进行验证,或者在 Command 的 Execute 方法中使用它更方便。

【讨论】:

  • 这对我很有效,谢谢。对 xamdatagrid 使用 AllowDelete="False" 的差别很小。
  • 更新了 AllowDelete="False"
【解决方案2】:

如果要从 UI 中删除项目,可以使用 ICommand 接口中的 CanExecute(object parameter)

【讨论】:

    【解决方案3】:
    1. 解决方案:

      我认为最好的方法是删除 ViewModel 中带有 Command 的项目。这样,您可以在命令的 CanExecute 方法中进行验证,如果无效则无法执行。 您可以使用InputBindingsEventToCommand 在用户交互后触发命令。

    2. 解决方案

      您可以从 ObservableCollection 继承并覆盖 RemoveItem 方法并在那里进行验证,但我建议按照上述方式进行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 2011-11-09
      • 1970-01-01
      • 2011-01-31
      • 2019-02-19
      相关资源
      最近更新 更多