将命令从业务对象绑定到MVVM中的View

Dav*_*ham 1 wpf datagrid business-objects mvvm

我通过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>
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,当我单击按钮时,需要从DataGrid中删除记录。

因此,我需要这样的要求:我应该将Command放在业务对象类中,而不是放在ViewModel类中。

当我单击每一行中的按钮时,应删除该对应的行。

因此,由于业务对象类不具有有关DataGrid项的信息,因此如何在业务对象类中执行命令来查找在DataGrid中选择哪个项目来删除行?

Zab*_*sky 5

首先,请勿将命令放入您的命令中Model,而应使用通过进行绑定RelativeSource。像这样:

<Button Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.RemoveCommand}" />
Run Code Online (Sandbox Code Playgroud)

其次,您可以将自己绑定DataGrid SelectedItem到您的财产ViewModel

<DataGrid SelectedItem="{Binding SelectedItemProperty, Mode=TwoWay}" .../>
Run Code Online (Sandbox Code Playgroud)

或将您选择的项目通过CommandParameter

<Button Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.RemoveCommand}" CommandParameter="{Binding}" />
Run Code Online (Sandbox Code Playgroud)