如何从ViewModel中的DataGrid获取currentrow

时间:2016-08-10 08:02:04

标签: c# wpf mvvm datagrid

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

<Button Command="{Binding DeleteRowCriterionCommand}">Delete</Button>

但我不知道如何在不使用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>

我使用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);
}

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

2 个答案:

答案 0 :(得分:3)

对于那些遇到与我相同问题的人,这就是解决方案:

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

CommandParameter="{Binding Path=SelectedIndex, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}">Delete</Button>

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

public RelayCommand<Object> DeleteRowCriterionCommand { get; private set; }

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

DeleteRowCriterionCommand = new RelayCommand<Object>(param => DeleteRowCriterion(param), param => CanDeleteRowCriterion());

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

private void DeleteRowCriterion(object parameter)
{
    UserCriteria.RemoveAt(Convert.ToInt32(parameter));
}

我希望它能帮助你们中的一些人:)

答案 1 :(得分:0)

如何使用按钮作为&#34;发件人&#34;然后通过父级获取Datagrid的SelectedIndex?