C# 将新行添加到绑定到DataGrid的DataTable后选择新行

C# 将新行添加到绑定到DataGrid的DataTable后选择新行,c#,wpf,datagrid,wpfdatagrid,C#,Wpf,Datagrid,Wpfdatagrid,我有一个简单的C#程序,数据表中有一些数据,它绑定到WPF数据网格 <DataGrid Grid.Row="1" DataContext="{Binding}" Name="dataGridEditTab" 我有一个“添加行”按钮,当按下该按钮时,会将一个空行添加到数据表中。空白行显示在DATAGRID微调上,但未被选中。我想自动选择新行,但我不知道如何执行此操作。我想我需要设置SelectedItem,但我还不知道是什么。有什么帮助吗?谢谢。根据此线程(),您可以使用。基本上创建一个全

我有一个简单的C#程序,数据表中有一些数据,它绑定到WPF数据网格

<DataGrid Grid.Row="1" DataContext="{Binding}" Name="dataGridEditTab"

我有一个“添加行”按钮,当按下该按钮时,会将一个空行添加到数据表中。空白行显示在DATAGRID微调上,但未被选中。我想自动选择新行,但我不知道如何执行此操作。我想我需要设置SelectedItem,但我还不知道是什么。有什么帮助吗?谢谢。

根据此线程(),您可以使用。基本上创建一个全局变量来放置新添加的行索引。在EventArgs中为该索引指定适当的值,然后使用该索引选择要查找的行

如果是MVVM,请为SelectedItem或SelectedIndex使用绑定。如果没有,最好使用它)

要实现您的目标,只需绑定SelectedIndex,无论何时添加行,都将SelectedIndex设置为RowsCount-1

这里有一个例子

<Grid >

    <DataGrid AutoGenerateColumns="False" CanUserAddRows="False" ItemsSource="{Binding Path=Persons}" Margin="0,65,0,0" 
                  SelectedIndex="{Binding Path=SelectedIndex, Mode=TwoWay}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="First name" Binding="{Binding Path=FirstName}" Width="*"/>
            <DataGridTextColumn Header="Last name" Binding="{Binding Path=LastName}" Width="*"/>
        </DataGrid.Columns>
    </DataGrid>
    <Button Content="Add new row" Height="23" HorizontalAlignment="Left" Margin="317,12,0,0" Command="{Binding Path=AddCommand}" VerticalAlignment="Top" Width="112" />
</Grid>

要尝试,DataGridCell已被选中。将其用于要选择的行
<Grid >

    <DataGrid AutoGenerateColumns="False" CanUserAddRows="False" ItemsSource="{Binding Path=Persons}" Margin="0,65,0,0" 
                  SelectedIndex="{Binding Path=SelectedIndex, Mode=TwoWay}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="First name" Binding="{Binding Path=FirstName}" Width="*"/>
            <DataGridTextColumn Header="Last name" Binding="{Binding Path=LastName}" Width="*"/>
        </DataGrid.Columns>
    </DataGrid>
    <Button Content="Add new row" Height="23" HorizontalAlignment="Left" Margin="317,12,0,0" Command="{Binding Path=AddCommand}" VerticalAlignment="Top" Width="112" />
</Grid>
public class MainViewModel : INotifyPropertyChanged
{
    private int _selectedPerson;

    public MainViewModel()
    {
        AddCommand = new RelayCommand(AddAndSelectePerson);
        Persons = new DataTable();
        Persons.Columns.Add("FirstName");
        Persons.Columns.Add("LastName");
        Persons.Rows.Add("Alexandr", "Puskin");
        Persons.Rows.Add("Lev", "Tolstoy");
    }

    public ICommand AddCommand { get; private set; }

    public int SelectedIndex
    {
        get { return _selectedPerson; }
        set
        {
            _selectedPerson = value;
            OnPropertyChanged("SelectedIndex");
        }
    }

    public DataTable Persons { get; private set; }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    private void AddAndSelectePerson()
    {
        Persons.Rows.Add();
        SelectedIndex = Persons.Rows.Count - 1;
    }

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class RelayCommand : ICommand
{
    private readonly Action _actionToExecute;

    public RelayCommand(Action actionToExecute)
    {
        _actionToExecute = actionToExecute;
    }

    #region ICommand Members

    public void Execute(object parameter)
    {
        _actionToExecute();
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    #endregion
}

public class Person
{
    public Person()
    {
    }

    public Person(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    public string FirstName { get; set; }

    public string LastName { get; set; }
}