我通过MVVM在WPF中填充DataGrid。我有4个属性的业务对象,以在DataGrid中创建行和列。
<DataGrid CanUserAddRows="True" ItemsSource="{Binding Path=PersonsInfo}" AutoGenerateColumns="False"
CanUserDeleteRows="True" CanUserReorderColumns="True"
CanUserSortColumns="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name}"/>
<DataGridTextColumn Header="Age" Binding="{Binding Path=Age}"/>
<DataGridTextColumn Header="Date Of Birth" Binding="{Binding Path=DateOfBirth}"/>
<DataGridTextColumn Header="Address" Binding="{Binding Path=Address}"/>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<Button Content="Remove..." Margin="3" Command="{Binding Path=RemoveCommand}" />
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
在上面的代码中,当我单击按钮时,我需要从DataGrid中删除记录。
所以我需要这样的要求:我应该在业务对象类中使用Command而不是在ViewModel类中。
当我点击每行中的按钮时,应该删除相应的行。
因此,我如何找到在DataGrid中选择哪个项目以通过业务对象类中的命令执行来删除行,因为业务对象类没有关于DataGrid项目的信息?
答案 0 :(得分:5)
首先,不要将命令放入Model
,而是通过RelativeSource
使用绑定。像这样:
<Button Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.RemoveCommand}" />
其次,您可以将DataGrid
SelectedItem
绑定到ViewModel
的属性
<DataGrid SelectedItem="{Binding SelectedItemProperty, Mode=TwoWay}" .../>
或通过CommandParameter
传递您选择的项目。
<Button Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.RemoveCommand}" CommandParameter="{Binding}" />