如何将 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
控件相关的任何其他内容。
如何将数据网格的排序命令绑定到视图模型?
下面是我的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
控件相关的任何其他内容。