How to set selected item of a DataGrid programmatically in WPF with MVVM application?

datagrid, datatable, mvvm, wpf

Solution

There are a few way to select items in the `DataGrid`. It just depends which one works best for the situation

First and most basic is `SelectedIndex` this will just select the Row at that index in the `DataGrid`

 <DataGrid SelectedIndex="{Binding SelectedIndex}" />

private int _selectedIndex;
public int SelectedIndex
{
    get { return _selectedIndex; }
    set { _selectedIndex = value; NotifyPropertyChanged("SelectedIndex"); }
}

SelectedIndex = 2;

`SelectedItem` will select the row that matches the row you set

<DataGrid SelectedItem="{Binding SelectedRow}" />

private DataRow _selectedRow;
public DataRow SelectedRow
{
    get { return _selectedRow; }
    set { _selectedRow = value; NotifyPropertyChanged("SelectedRow");}
}

SelectedRow = items.First(x => x.whatever == something);

The most common one is `SelectedValue` with `SelectedValuePath` set, in this case you set the column you want to select with and then to can select the row by setting the corresponding value

<DataGrid SelectedValuePath="Size Quantity" SelectedValue="{Binding SelectionValue}" 

private string _selectedValue
public string SelectionValue 
{
    get { return _selectedValue; }
    set { _selectedValue = value; NotifyPropertyChanged("SelectionValue"); }
}

SelectionValue = "Blue";

Edit:

Here is my test and it is highlighting just fine

Code:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();

        this.SizeQuantityTable = new DataTable();
        DataColumn sizeQuantityColumn = new DataColumn();
        sizeQuantityColumn.ColumnName = "Size Quantity";
        ...................
        ........

    }

    private string _selectedValue;
    public string SelectionValue 
    {
        get { return _selectedValue; }
        set { _selectedValue = value; NotifyPropertyChanged("SelectionValue"); }
    }

    private int _selectedIndex;
    public int SelectedIndex
    {
        get { return _selectedIndex; }
        set { _selectedIndex = value; NotifyPropertyChanged("SelectedIndex"); }
    }

    private DataTable sizeQuantityTable;
    public DataTable SizeQuantityTable
    {
        get { return sizeQuantityTable; }
        set { sizeQuantityTable = value; NotifyPropertyChanged("SizeQuantityTable"); }
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        SelectedIndex = 2;
    }

    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        SelectionValue = "Blue";
    }

    private void NotifyPropertyChanged(string p)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(p));
        }
    }
}

Xaml:

<Window x:Class="WpfApplication21.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="202" Width="232" Name="UI">

    <Grid DataContext="{Binding ElementName=UI}">
        <DataGrid SelectedValuePath="Size Quantity"        
                  SelectedValue="{Binding SelectionValue}" 
                  SelectedIndex="{Binding SelectedIndex}"
                  ItemsSource="{Binding SizeQuantityTable}"
                  AutoGenerateColumns="True" 
                  Margin="0,0,0,41" />
        <StackPanel Orientation="Horizontal" Height="37" VerticalAlignment="Bottom" >
            <Button Content="SelectedIndex" Height="26"  Width="107" Click="Button_Click_1"/>
            <Button Content="SelectedValue" Height="26"  Width="107" Click="Button_Click_2"/>
        </StackPanel>
    </Grid>
</Window>

Result:

Problem

I have bound the `DataTable` to the `DataGrid` control. How can I set the selected item programmatically ? Example In my `view model` I have a property of type DataTable to bind the DataGrid ``` private DataTable sizeQuantityTable; public DataTable SizeQuantityTable { get { return sizeQuantityTable; } set { sizeQuantityTable = value; NotifyPropertyChanged("SizeQuantityTable"); } } ``` My `XAML` ``` <DataGrid ItemsSource="{Binding SizeQuantityTable}" AutoGenerateColumns="True" Margin="0,0,0,120" /> ``` The `constructor` of the view model (assigning dummy values) ``` this.SizeQuantityTable = new DataTable(); DataColumn sizeQuantityColumn = new DataColumn(); sizeQuantityColumn.ColumnName = "Size Quantity"; this.SizeQuantityTable.Columns.Add(sizeQuantityColumn); DataColumn sColumn = new DataColumn(); sColumn.ColumnName = "S"; this.SizeQuantityTable.Columns.Add(sColumn); DataColumn mColumn = new DataColumn(); mColumn.ColumnName = "M"; this.SizeQuantityTable.Columns.Add(mColumn); DataRow row1 = this.SizeQuantityTable.NewRow(); row1[sizeQuantityColumn] = "Blue"; row1[sColumn] = "12"; row1[mColumn] = "15"; this.SizeQuantityTable.Rows.Add(row1); DataRow row2 = this.SizeQuantityTable.NewRow(); row2[sizeQuantityColumn] = "Red"; row2[sColumn] = "18"; row2[mColumn] = "21"; this.SizeQuantityTable.Rows.Add(row2); DataRow row3 = this.SizeQuantityTable.NewRow(); row3[sizeQuantityColumn] = "Green"; row3[sColumn] = "24"; row3[mColumn] = "27"; this.SizeQuantityTable.Rows.Add(row3); ``` OK. I have created three columns namely `sizeQuantityColumn`, `sColumn` and `mColumn` and added three rows namely `row1`, `row2` and `row2`. So, Let's say I wanna set the selected item as `row2` (So in the view, the second row should be highlighted). How can I do this? EDIT I hardcoded the `SelectedIndex` of the DataGrid to 1. (So the second row should be selected). In `design time` it shows as selected. But not in the run time. You can see it in the below snapshot. So ultimaltely the problem is Not highlighting the row.

Original source