DataGrid 绑定命令到行选择
Posted
技术标签:
【中文标题】DataGrid 绑定命令到行选择【英文标题】:DataGrid bind command to row select 【发布时间】:2013-02-25 23:01:06 【问题描述】:当用户在 DataGrid 中选择一行时,我想执行一个命令。
我看到可以将单元格内容包装在按钮中(尽管我不想要按钮样式) - 但我不想在单元格级别这样做。
我还看到可以使用行为将命令链接到事件。但最好是我不应该为这样一个常见的任务诉诸行为。
是否可以通过普通的旧命令数据绑定来做到这一点?
所以:1) 用户点击 DataGrid 行 2) 视图模型上的命令被触发。
【问题讨论】:
【参考方案1】:您应该使用“交互”程序集和SelectionChanged
事件。
<DataGrid AutoGenerateColumns="False" ItemsSource="Binding People">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="Binding ID" />
<DataGridTextColumn Header="Name" Binding="Binding Name" />
</DataGrid.Columns>
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="Binding MyCommand" />
</i:EventTrigger>
</i:Interaction.Triggers>
</DataGrid>
其中“i”是命名空间:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
您还可以编写对 DataGrid 的 SelectedItem
属性的绑定,并在 set 访问器中调用您的命令,但我上面介绍的第一个解决方案更好。
如果您想从主视图模型调用命令并从DataGrid
传递SelectedItem
,您可以使用CommadParameter
:
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="Binding MyCommand"
CommandParameter="Binding Path=SelectedItem, RelativeSource=RelativeSource Mode=FindAncestor, AncestorType=DataGrid" />
</i:EventTrigger>
</i:Interaction.Triggers>
当 items 有自己的命令时,您可以使用以下代码:
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="Binding Path=SelectedItem.MyCommand, RelativeSource=RelativeSource Mode=FindAncestor, AncestorType=DataGrid" />
</i:EventTrigger>
</i:Interaction.Triggers>
或者如果元素有自己的视图模型分配给它DataContext
,您可以使用以下代码:
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="Binding Path=SelectedItem.DataContext.MyCommand, RelativeSource=RelativeSource Mode=FindAncestor, AncestorType=DataGrid" />
</i:EventTrigger>
</i:Interaction.Triggers>
【讨论】:
到目前为止标记为答案,因为它看起来不错并且相当简单。谢谢!我也尝试过 SelectedItem 但由于虚拟化而遇到了一些问题。一般来说,DataGrid 似乎有一些错误。 好的,刚刚尝试过,然后在顶层视图模型上触发,而不是 DataGrid 中每个元素的视图模型。我不认为我可以让它直接在相关的视图模型上触发?否则我想我也会使用 SelectedItem。 @BentRasmussen 再次检查我的答案,我添加了更多示例。 三重赞!你给我省了一大堆麻烦!我以前有一个非常丑陋的背部。谢谢一百万! @JonathanTuzman 请看这个问题:***.com/questions/8360209/…【参考方案2】:请注意,@kmatyaszek 的答案在 .NET 5.0 及更高版本中已过时,我们应该使用 Microsoft.Xaml.Behaviors
而不是 Microsoft.Expression.Interactions
。
所以命名空间中的i
应该是:
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
详情请见here。
【讨论】:
以上是关于DataGrid 绑定命令到行选择的主要内容,如果未能解决你的问题,请参考以下文章
将 DataGrid 行中的 DoubleClick 命令绑定到 VM
wpf datagrid 默认选择为最新的一行,不知道为啥设置不了