如何从 ViewModel 中的 DataGrid 获取当前行

Pie*_*rre 3 c# wpf datagrid mvvm

我有一个 DataGrid,它的每一行都包含一个删除按钮,如下所示:

<Button Command="{Binding DeleteRowCriterionCommand}">Delete</Button>
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在不使用 DataGrid.Name 的情况下获取 currentItem 属性

    <!-- 2ND : CRITERIA -->
    <Grid>
        <DataGrid ItemsSource="{Binding UserCriteria, Mode=TwoWay}" SelectedItem="{Binding SelectedItemDG, Mode=TwoWay}" AutoGenerateColumns="False">
            <DataGrid.Columns>

                <!--TEXTBOX FOR SQL VALUES--> 
                <DataGridTemplateColumn Header="SQLValue" Width="600">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

                <!-- BUTTON FOR DELETING -->
                <DataGridTemplateColumn Width="*">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button Command="{Binding DeleteRowCriterionCommand}">Delete</Button>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

            </DataGrid.Columns>
        </DataGrid>
    </Grid>
Run Code Online (Sandbox Code Playgroud)

我正在使用 MVVMLight,所以我知道如何将我的命令连接到我的 ViewModel,但唯一缺少的是获取我单击按钮所在行的索引。

这是使用 DataGrid.Name 的功能:

public void DeleteRowCriterion()
{
    // I would like to replace the first line by not using DataGridName

    // int currentRowIndex = DataGridName.Items.IndexOf(CriteriaDG.CurrentItem);
    // UserCriteria.RemoveAt(currentRowIndex);
}
Run Code Online (Sandbox Code Playgroud)

如果有人知道怎么做,我会很感激的!

Pie*_*rre 6

对于那些与我有同样问题的人,这是解决方案:

在您的 XAML 中,您必须将参数添加到您的按钮。它包含行的索引!(不要改变任何东西,它独立于 DataGrid 的名称工作)

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

然后,在您的 ViewModel 中,您必须创建您的 RelayCommand

public RelayCommand<Object> DeleteRowCriterionCommand { get; private set; }
Run Code Online (Sandbox Code Playgroud)

您必须添加<Object>如果你想利用你所添加的参数CommandParameter。然后,您在构造函数中实例化您的属性

DeleteRowCriterionCommand = new RelayCommand<Object>(param => DeleteRowCriterion(param), param => CanDeleteRowCriterion());
Run Code Online (Sandbox Code Playgroud)

现在,您可以在函数中使用参数:

private void DeleteRowCriterion(object parameter)
{
    UserCriteria.RemoveAt(Convert.ToInt32(parameter));
}
Run Code Online (Sandbox Code Playgroud)

我希望它会希望你们中的一些人:)