如何将 DataGrid 排序事件绑定到 Prism ViewModel DelegateCommand

How to bind DataGrid Sorting event to Prism ViewModel DelegateCommand

如何将数据网格的排序命令绑定到视图模型?

下面是我的XAML代码

<DataGrid ItemsSource="{Binding ViewModels}"
          CanUserSortColumns="True"
          Sorting="{Binding ViewModel_SortingCommand}">
</DataGrid>

下面是导致绑定错误的 ViewModel 实现

ViewModel_SortingCommand = new DelegateCommand<DataGridSortingEventArgs>(ViewModel_Sorting;

public void ViewModel_Sorting(DataGridSortingEventArgs args)
{
    // Error on binding
}

因为Sorting是一个事件,你不能直接绑定它,但是你可以使用EventTrigger.

<DataGrid ItemsSource="{Binding ViewModels}"
          CanUserSortColumns="True">
   <i:Interaction.Triggers>
      <i:EventTrigger EventName="Sorting">
         <i:InvokeCommandAction Command="{Binding ViewModel_SortingCommand}"/>
      </i:EventTrigger>
   </i:Interaction.Triggers>
</DataGrid>

如果您使用 Blend 附带的传统混合行为,请使用此命名空间:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

如果您使用新的 Microsoft.Xaml.Behaviors.Wpf Nuget 包,请使用此命名空间:

xmlns:i="http://schemas.microsoft.com/xaml/behaviors"

如果您需要在命令中处理事件参数,请将 PassEventArgsToCommand 设置为 True:

<b:InvokeCommandAction Command="{Binding FavContextMenuEditCmd}" PassEventArgsToCommand="True"/>

另请注意,有一个 EventArgsParameterPath 属性 用于在应该传递给命令的事件参数中指定一个 属性 和一个 EventArgsConverter 属性 使用转换器。这些有助于避免将 UI 相关类型(如事件参数)传递给您的视图模型。

DataGridSortingEventArgs 传递给视图模型会破坏 MVVM 模式。

您应该在 view/control 中执行排序,或者,如果您真的对视图模型上下文中的排序顺序感兴趣,请对视图绑定到的实际源集合进行排序。通常,视图模型对用户如何对视图中的数据进行排序、分组或过滤不感兴趣或不了解。

无论如何,视图模型不应依赖于 DataGridSortingEventArgs 或与视图中的 DataGrid 控件相关的任何其他内容。