DotNetRussell
DotNetRussell

Reputation: 9857

DataGrid SelectedItem not updating

So I am reallly confused here.

I created a datagrid, bound its itemsource two way and bound its selected item two way. The selected item getter gets called but the setter never does. All the pieces seem to be here. What am I missing?

 <DataGrid ItemsSource="{Binding Properties ,Mode=TwoWay}" 
                  SelectedItem="{Binding SelectedProperty ,Mode=TwoWay}" 
                  CanUserDeleteRows="False"  CanUserAddRows="False" AutoGenerateColumns="False" Background="LightBlue">

   <DataGrid.Columns>
      <DataGridTextColumn IsReadOnly="True"  Header="Address" Binding="{Binding Address}"/>
   </DataGrid.Columns>
   <DataGrid.RowDetailsTemplate>
     <DataTemplate>
        <DataGrid ItemsSource="{Binding Units ,Mode=TwoWay}" 
                  SelectedItem="{Binding SelectedUnit, Mode=TwoWay}" 
                  CanUserDeleteRows="False" CanUserAddRows="False" AutoGenerateColumns="False">

My first datagrid works fine including the selected item.

The second third and fourth nested grids however don't bind to the selected item. The items sources work but that is it

   public class PropertyModel : ModelBase
   {
    private ObservableCollection<UnitModel> _Units;

    public ObservableCollection<UnitModel> Units
    {
        get { return _Units; }
        set { _Units = value; }
    }
    private UnitModel _SelectedUnit;

    public UnitModel SelectedUnit
    {
        get { return _SelectedUnit; }
        set { _SelectedUnit = value; OnPropertyChanged("SelectedUnit"); }
    }

There are no binding expression errors or any other errors displayed in the output window.

Upvotes: 13

Views: 10608

Answers (2)

DotNetRussell
DotNetRussell

Reputation: 9857

The answer to this is pretty obvious actually.

I forgot to put UpdateSourceTrigger=PropertyChanged

so it should look like this

 <DataGrid ItemsSource="{Binding Units ,Mode=TwoWay}" 
       SelectedItem="{Binding SelectedUnit,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
       CanUserDeleteRows="False" CanUserAddRows="False" AutoGenerateColumns="False">

This solved the problem

Upvotes: 12

SamTh3D3v
SamTh3D3v

Reputation: 9944

I faced something similar to that a couple of months ago, for some reason the inner DataGrid ItemSource wasn't set correctly using that way, i managed to fix that by binding using ElementName to set the RowDetail DataGrid ItemSource to the SelectedItem in the parent one :

<DataGrid x:Name="DataGrid" ItemsSource="{Binding Properties ,Mode=TwoWay}" 
                  SelectedItem="{Binding SelectedProperty ,Mode=TwoWay}" 
                  CanUserDeleteRows="False"  CanUserAddRows="False" AutoGenerateColumns="False" Background="LightBlue">

   <DataGrid.Columns>
      <DataGridTextColumn IsReadOnly="True"  Header="Address" Binding="{Binding Address}"/>
   </DataGrid.Columns>
   <DataGrid.RowDetailsTemplate>
     <DataTemplate>
        <DataGrid ItemsSource="{Binding SelectedItem.Units ,Mode=TwoWay,ElementName=DataGrid}" 

Upvotes: 1

Related Questions