我想,当用户选择在DataGrid中的行执行命令。
我看到是有可能包裹在按钮单元格内容(虽然我不希望的按钮样式做) - 但我不想在细胞层面做到这一点。
我也看到有可能使用行为的命令链接到的事件。 但最好我不应该诉诸行为,这种共同的任务。
是否有可能通过普通的旧命令绑定做到这一点?
所以:1)用户点击DataGrid行2)上视图模型命令被触发。
提前致谢。
我想,当用户选择在DataGrid中的行执行命令。
我看到是有可能包裹在按钮单元格内容(虽然我不希望的按钮样式做) - 但我不想在细胞层面做到这一点。
我也看到有可能使用行为的命令链接到的事件。 但最好我不应该诉诸行为,这种共同的任务。
是否有可能通过普通的旧命令绑定做到这一点?
所以:1)用户点击DataGrid行2)上视图模型命令被触发。
提前致谢。
您应该使用“交互”组装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"
你也可以写结合SelectedItem
DataGrid的财产和set访问,你可以调用你的命令,但我提出你上面的第一个解决方案是更好的。
如果你想从主视图模型调用命令和传递SelectedItem
从DataGrid
您可以使用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>
当项目有自己的命令,你可以用下面的代码:
<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>