当用户在DataGrid中选择一行时,我希望执行一个命令。
我知道可以将单元格内容包装在按钮中(虽然我不想使用按钮样式)-但我不想在单元格级别上操作。
我也知道可以使用behaviors将命令链接到事件。 但最好不要为这样的常见任务而采用behaviors。
是否可以通过纯旧式命令数据绑定来实现这一点?
因此:1)用户单击DataGrid行2)视图模型上的命令被触发。
当用户在DataGrid中选择一行时,我希望执行一个命令。
我知道可以将单元格内容包装在按钮中(虽然我不想使用按钮样式)-但我不想在单元格级别上操作。
我也知道可以使用behaviors将命令链接到事件。 但最好不要为这样的常见任务而采用behaviors。
是否可以通过纯旧式命令数据绑定来实现这一点?
因此:1)用户单击DataGrid行2)视图模型上的命令被触发。
您应该使用“Interactivity”程序集和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属性的绑定器,在设置访问器中调用你的命令,但我上面介绍的第一种解决方案更好。
如果你想从主视图模型中调用命令并传递DataGrid的SelectedItem,你可以使用CommandParameter:
<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>
Microsoft.Xaml.Behaviors
代替Microsoft.Expression.Interactions
。
因此,命名空间中的i
应该是:
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
详情请参见此处。